最近寫項目用到了線程池,之前瞭解線程池,但是一直沒有自己實現,今天實現了線程池,現在總結下。
項目裏用到的線程池是一次性把所有線程創建好,主線程接受任務調用添加任務的函數把任務添加到隊列(運用了互斥鎖)之後通知空閒隊列中的線程有任務到來了(運用了條件變量)
//定義互斥鎖 定義條件變量
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函數前加鎖了,當條件還未成立的時候該函數會阻塞,這時候該函數會自動將互斥鎖進行解鎖,當條件成立後該函數會爭奪互斥鎖對互斥鎖進行加鎖,所以這就是條件變量和互斥鎖爲什麼要搭配在一起使用的原因