文章目录
一、多线程存在的问题
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