Linux條件變數的使用

2021-07-10 11:08:10 字數 518 閱讀 9669

linux執行緒同步之間存在多種機制,條件變數是一種類似作業系統裡提到的生產者-消費者演算法的同步機制,允許執行緒以無競爭的方式等待特定條件的發生。

示例偽**:

void* thread1(void)

}void* thread2(void)

}

條件變數需要配合互斥量一起使用,互斥量作為引數傳入wait函式,函式把呼叫執行緒放到等待條件的執行緒列表上,然後對互斥量解鎖,這兩個是原子操作。當執行緒等待到條件,從wait函式返回之前,會再次鎖住互斥量。

1.lock

2.unlock

3.等待

4.lock

5.unlock

第2,3,4步是wait的內部操作

在wait被喚醒後,還需要在while中去檢查條件,這是為了防止「驚群效應」,比如有兩個執行緒同時阻塞在wait,先後醒來,快的執行緒做完處理然後把條件reset了,並且對互斥量解鎖,此時慢的執行緒在wait裡獲得了鎖(即第4步)返回,還再去做處理就會出問題。

Linux 下條件變數的使用

1,引入 在很多情況下,對於典型的生產者 消費者模型,多執行緒之間的同步,如直接使用mutex,除了生產者 消費者之間要競爭互斥量以外,消費者之間也需要競爭互斥量,但如果生產者中沒有資料,消費者之間競爭互斥鎖是無意義的。有了條件變數機制以後,只有生產者完成生產,才會引起消費者之間的競爭。這樣可以提高...

linux條件變數

linux條件變數 條件變數 條件變數是利用執行緒間共享是全域性變數進行同步的一種機制。條件變數巨集觀上類似if語句,符合條件就能執行某段程式,否則只能等待條件成立。一 函式 pthread cond init函式 初始化條件變數 pthread cond wait函式 基於條件變數阻塞,無條件等待...

Linux 條件變數

當乙個執行緒互斥地訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。例如 乙個執行緒訪問佇列時,發現隊列為空,它只能等待,直到其它執行緒將乙個節點新增到佇列中。類似這種情況就需要用到條件變數。同步概念與競態條件 同步 在保證資料安全的前提下,讓執行緒能夠按照某種特定的順序訪問臨界資...