嵌入式笔记20 链表(任务队列 线程池)

本文探讨了多线程存在的问题,如线程数量限制和创建销毁开销,并详细介绍了任务队列的工作原理,包括空队列时线程的阻塞等待、非空队列时的任务处理以及满队列时的任务限制。接着,讨论了线程池的概念,包括线程数量、工作线程、任务队列大小和锁的管理。最后,展示了线程池实现中的关键数据结构和同步原语。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、多线程存在的问题

1、进程所支持的线程数量问题(受限)
2、线程的创建和销毁的开销问题

二、任务队列

任务队列为空时,线程池里的线程阻塞等待
任务里的线程队列不为空,线程池里的线程处理任务
任务队列为满,不能添加新的任务

三、线程池

1、线程池里线程的数量
2、线程池里的工作线程数量
3、任务队列的大小
4、任务队列的锁

example

int thread_num / /已开启的线程数量
void *(*func)(void *arg);//任务行数、
struct job *next;//定义指针
struct job *head;//任务队列的头
steuct job *tail;//任务队列的尾
int queue_max_num;//任务队列的最大数
int queue_cur_num;//任务队列已有多少个任务
pthread_t *pthread_ids;//保存线程池中线程ID
pthread_cond_t queue_empty;//任务队列为空单位条件
pthread_cond_t queue_not_empty;//任务队列不为空的条件
pthread_cont_t queue_not_full;//任务队列不为满的条件
每个线程输出hello world和welcome to china

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

struct job
{
   
    /*任务队列参数*/
    void *(*func)(void *arg);
    //任务行数
    void *arg;
    struct job *next;//定义指针
};

struct threadpool
{
   
    /*线程参数*/
    int thread_num;//已开启的线程数量
    pthread_t *pthread_ids;//保存线程池中线程ID

    struct job *head;//任务队列的头
    struct job *tail;//任务队列的尾
    int queue_max_num;//任务队列的最大数
    int queue_cur_num;//任务队列已有多少个任务

    pthread_mutex_t mutex;//加锁
    pthread_cond_t queue_empty;//任务队列为空单位条件
    pthread_cond_t queue_not_empty;//任务队列不为空的条件
    pthread_cond_t queue_not_full;//任务队列不为满的条件

};
/*线程函数*/
void *threadpool_function(void *arg)
{
   
    struct threadpool *pool = (struct threadpool *)arg;
    struct job *pjob = NULL;
    
    
    while(1)
    {
   
        pthread_mutex_lock(&(pool->mutex));

        while(pool->queue_cur_num == 0)//如果任务队列为空
        {
   
            pthread_cond_wait(&(pool->queue_not_empty), &(pool->mutex));//等待到不阻塞执行队列中的任务


        }

        pjob = pool->head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_49181551

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值