最近写项目用到了线程池,之前了解线程池,但是一直没有自己实现,今天实现了线程池,现在总结下。
项目里用到的线程池是一次性把所有线程创建好,主线程接受任务调用添加任务的函数把任务添加到队列(运用了互斥锁)之后通知空闲队列中的线程有任务到来了(运用了条件变量)
//定义互斥锁 定义条件变量
pthread_mutex_t mutex;
pthread_cond_t cond;
//互斥锁 条件变量的初始化
pthread_mutex_init(&mutex, NULL); //互斥锁的初始化 在函数内部初始化,在函数外会报错
pthread_cond_init(&cond, NULL); //条件变量的初始化
pthread_mutex_lock(&mutex); //互斥锁加锁
pthread_mutex_unlock(&mutex); //互斥锁解锁
pthread_cond_signal(&cond); //当事件发生的时候就会发送信号给等待条件成立的线程
pthread_cond_wait(&cond, &mutex); //等待条件成立的函数,条件不成立就会阻塞
int pthread_cond_broadcast(&cond); //该函数用来对所有等待参数cond所指定的条件变量的线程解除阻塞,调用成功返回0 唤醒线程
/*条件变量和互斥量别忘了销毁*/
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&pool->cond);
这里讲一下pthread_cond_wait(&cond, &mutex);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
在pthread_cond_wait函数前加锁了,当条件还未成立的时候该函数会阻塞,这时候该函数会自动将互斥锁进行解锁,当条件成立后该函数会争夺互斥锁对互斥锁进行加锁,所以这就是条件变量和互斥锁为什么要搭配在一起使用的原因