pthread_cond_broadcast用處


以前學習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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM