線程間使用的線程同步方法

最近寫項目用到了線程池,之前瞭解線程池,但是一直沒有自己實現,今天實現了線程池,現在總結下。

項目裏用到的線程池是一次性把所有線程創建好,主線程接受任務調用添加任務的函數把任務添加到隊列(運用了互斥鎖)之後通知空閒隊列中的線程有任務到來了(運用了條件變量)

//定義互斥鎖   定義條件變量
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函數前加鎖了,當條件還未成立的時候該函數會阻塞,這時候該函數會自動將互斥鎖進行解鎖,當條件成立後該函數會爭奪互斥鎖對互斥鎖進行加鎖,所以這就是條件變量和互斥鎖爲什麼要搭配在一起使用的原因

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章