以前學習POSIX THREAD時就不太理解broadcast在什么場景下使用比較合適。因為broadcast的語義是喚醒所有被阻塞的線程。
當時的想法是,在系統析構時調用它比較有效,喚醒阻塞的線程,回收線程資源,然后退出系統。
今天在做 lock_server 時,才了解到broadcast的用處,它的效果是,減少系統中條件變量的個數
需求
系統中有很多鎖,鎖有FREE和LOCKED兩種狀態。不同的client會申請自己需要的鎖,server響應client的申請。假如client申請的鎖已被占用,那么client應該阻塞,等待鎖被釋放。
設計1
client阻塞在它需要的那個鎖上,應該是pthread_cond_wait(&lockid, &mutex)
這樣設計的話,對於每一個鎖,都需要一個對應的條件變量,這樣設計增加了系統的復雜性
設計2 應用broadcast
系統中設置一個共享的條件變量 cond,所有的線程阻塞在cond上
while(lock_status_[lid] == LOCKED) {
pthread_cond_wait(&c_, &m_);
}
pthread_cond_broadcast(&c_);
這樣,一旦某個鎖被釋放,所有的阻塞線程都會被喚醒,但唯有阻塞在這個鎖的線程才能真正被喚醒。
另外,mutex的使用,保證了最多一個線程被真正喚醒,即便是broadcast。
