linux条件变量
某個線程正在等待共享數(shù)據(jù)內(nèi)某個條件出現(xiàn),可可能需要重復(fù)對數(shù)據(jù)對象加鎖和解鎖(輪詢),但是這樣輪詢非常耗費時間和資源,而且效率非常低。我們需要這樣一種方法:當(dāng)線程在等待滿足某些條件時使線程進(jìn)入睡眠狀態(tài),一旦條件滿足,就喚醒因等待滿足特定條件而睡眠的線程
條件變量
條件變量是用來等待線程而不是上鎖的。條件變量使我們可以睡眠等待某種條件出現(xiàn)。條件變量主要包括兩個動作:一個線程等待”條件變量的條件成立”而掛起;另一個線程使”條件成立”(給出條件成立信號)。
為了防止競爭,條件變量的使用總是和一個互斥鎖結(jié)合在一起。對條件的測試是在互斥鎖(互斥)的保護(hù)下進(jìn)行的。
使用時,條件變量被用來阻塞一個線程,當(dāng)條件不滿足時,線程往往解開響應(yīng)的互斥鎖并等待條件發(fā)生變化,一旦其他的某個線程改變了條件變量,它將通知相應(yīng)的條件變量喚醒一個或多個正被此條件變量阻塞的線程,這些線程將重新鎖定互斥鎖并且重新測試條件是否滿足
等待
兩種等待方式,無條件等待pthread_cond_wait()和計時等待pthread_cond_timedwait()。其中計時等待方式如果在給定時刻前條件沒有滿足,則返回ETIMEOUT,結(jié)束等待。
喚醒
喚醒條件有兩種形式,pthread_cond_signal()喚醒一個等待該條件的線程,存在多個等待線程時按入隊順序喚醒其中一個;而pthread_cond_broadcast()則喚醒所有等待線程。
喚醒阻塞在條件變量上的所有線程的順序由調(diào)度策略決定,如果線程的調(diào)度策略是SCHED_OTHER類型的,系統(tǒng)將根據(jù)線程的優(yōu)先級喚醒線程。
由于pthread_cond_broadcast函數(shù)喚醒所有阻塞在某個條件變量上的線程,這些線程被喚醒后將再次競爭相應(yīng)的互斥鎖,所以必須小心使用pthread_cond_broadcast函數(shù)。
總結(jié)
- 上一篇: linux c语 curl代码_偷懒必备
- 下一篇: android 顶部标签切换,Andro