相關api:
pthread_cond_signal/setevent
pthread_cond_wait/waitforsingleobject
0) windows上叫做事件event,linux上叫做條件變數cond
1) 事件的狀態分為有訊號(signaled)和無訊號(unsignaled),有時也成為置位和重置
2) 當事件unsignaled時,wait會阻塞直到事件signaled
3) 當事件signaled時,wait才會返回
當事件從unsignaled->signaled時,wait返回,此時的附帶行為會有所不同
分3類說明:
1. windows下auto set event
1) 如果此時有多個執行緒正在waitforsingleobject這個event,那麼只有其中乙個執行緒能夠成功返回,並且使得這個event變為unsignaled,其他執行緒繼續阻塞
2) 如果當前沒有執行緒在等待,其狀態會保持為置位(signaled)
2. windows下manual event
1) 當乙個事件是手動重置事件,事件被觸發後,所有等待的執行緒都會變成可排程狀態,該事件在觸發後一直為觸發狀態,直到手動重置該事件為未觸發狀態
3. linux下的signal/wait
1) 當條件變數置位(signaled)以後,即使當前沒有任何執行緒在等待,其狀態也會恢復為復位(unsignaled)狀態
2) 使用pthread_cond_signal一般不會有「驚群現象」產生,他最多隻給乙個執行緒發訊號
一般來講,linux下使用條件變數需要用到mutex,即:
pthread_mutex_lock()
/* in any waiting thread: */while
(!buf->full) // 防止虛假喚醒 spurious_wakeup
wait(
&buf->cond,
&buf->lock)
;/* in any other thread: */
if(buf->n >= buf->size)
pthread_mutex_unlock()
多執行緒學習之七讀寫鎖
read write lock pattern 讀寫 一 read write lock pattern的參與者 讀寫鎖 資料 共享資源 讀執行緒 寫執行緒 二read write lock pattern模式什麼時候使用 為了多線執行緒環境下保護資料安全,我們必須避免的衝突 乙個執行緒讀取,另乙個...
多執行緒開發學習筆記之執行緒同步 事件
事件,在我看來就是一種觸發機制,即滿足某一條件的觸發。當執行緒需要等待某一事件的發生而不是乙個資源的解鎖,這在接收網路資訊包或等待乙個已完成某些任務的執行緒發出訊號時非常有用。在win32系統中,提供了事件物件。事件物件是同步物件中最簡單的形式,也是最具有彈性的同步機制。其與互斥量和訊號量的區別在於...
多執行緒學習 讀寫鎖
讀寫鎖 reentrantreadwritelock 具有互斥排他效果,即同一時間只有乙個執行緒在執行鎖後面的任務,這種效率比較搞。讀鎖也稱為共享鎖,寫鎖也稱為排他鎖。多個讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。在沒有執行緒thread進行寫入操作時,進行讀取操作的多個執行緒都可以獲取讀鎖,...