C 11 多執行緒 Part 7 條件變數

2022-07-31 02:33:14 字數 2014 閱讀 4368

翻譯自:

在本文中,我們將通過示例討論c++ 11多執行緒中條件變數的用法。

條件變數

條件變數是一種事件,用於在兩個或多個執行緒之間進行訊號傳遞。乙個或多個執行緒可以等待它發出訊號,而另乙個執行緒可以發出訊號。

c++ 11中的條件變數所需的標頭檔案是

#include
需要互斥鎖以及條件變數。

條件變數實際如何工作

* 執行緒1呼叫條件等待變數,該變數在內部獲取互斥量並檢查是否滿足所需條件。

* 如果沒有滿足條件,則釋放鎖並等待條件變數得到訊號(執行緒被阻塞)。 條件變數的wait()函式以原子方式(?)提供這兩種操作。

* 另乙個執行緒,即像執行緒2一樣在滿足條件時發出條件變數訊號

* 一旦條件變數得到訊號,正在等待的執行緒1將恢復。 然後,它再次獲取互斥鎖,並檢查與條件變數關聯的條件是否實際滿足或是否為上級呼叫。 如果有多個執行緒在等待,那麼notify_one將僅解除乙個執行緒。

* 如果是上級呼叫,則再次呼叫wait()函式。

std::condition_variable的主要成員函式是

wait()

它使當前執行緒阻塞,直到訊號通知條件變數或發生虛假喚醒為止。

它以原子方式釋放附加的互斥鎖,阻止當前執行緒,並將其新增到等待當前條件變數物件的執行緒列表中。 當某些執行緒在同一條件變數物件上呼叫notify_one()或notify_all()時,該執行緒將被解除阻塞。 它也可能會被虛假地解除阻塞,因此,每次解除阻塞後,都需要再次檢查條件。

**將作為引數傳遞給此函式,該函式將被呼叫以檢查它是否是虛假呼叫或是否實際滿足條件。

執行緒解鎖後,

wait()函式重新獲取互斥鎖,並檢查是否滿足實際條件。 如果不滿足條件,則再次自動釋放附加的互斥鎖,阻塞當前執行緒,並將其新增到等待當前條件變數物件的執行緒列表中。

notify_one()

如果有任何執行緒在同一條件變數物件上等待,則notify_one會解除封鎖其中乙個等待執行緒。
notify_all()

如果有任何執行緒在同一條件變數物件上等待,則notify_all解除封鎖所有正在等待的執行緒。

讓我們來看看如何使用條件變數

問題場景

假設我們正在構建乙個基於網路的應用程式。 該應用程式執行以下任務,

1.與伺服器進行一些handshaking

2.從xml檔案載入資料。

3.對從xml載入的資料進行處理。

正如我們所見,任務1不依賴於任何其他任務,但是任務3依賴於任務2。因此,這意味著任務1和任務2可以由不同的執行緒並行執行以提高應用程式的效能。 因此,讓我們將其分解為乙個多執行緒應用程式,

執行緒1的職責是

* 與伺服器進行一些handshaking。

* 等待執行緒2從xml載入資料

* 對從xml載入的資料進行處理。

執行緒2的職責是

* 從xml載入資料

* 通知另乙個執行緒,即等待訊息。

使用條件變數實現此目的的**如下,

#include #include #include #include #include using namespace std::placeholders;

void loaddata()

bool isdataloaded()

else

return m_bdataloaded;

} void maintask()

};int main()

/*輸出結果

do some handshaking

load false

loaddata start

loading data from xml

load true

do processing on loaded data

*/

C 11多執行緒學習 條件變數

c 11中的std condition variable 首先,舉個例子 在應用程式中有4個程序thread1,thread2,thread3和thread4,有乙個int型別的全域性變數icount。icount初始化為0,thread1和thread2的功能是對icount的加1,thread3...

C 11 多執行緒同步 互斥鎖 條件變數

在多執行緒程式中,執行緒同步 多個執行緒訪問乙個資源保證順序 是乙個非常重要的問題,linux下常見的執行緒同步的方法有下面幾種 這篇部落格只介紹互斥量和條件變數的使用。通常情況下,互斥鎖和條件變數是配合使用的,互斥鎖用於短期鎖定,主要保證執行緒對臨界區的進入 條件變數用於執行緒長期等待,在wait...

C11執行緒管理 條件變數

c11提供另外一種用於等待的同步機制,它可以阻塞乙個或者多個執行緒,直到收到另外乙個執行緒發出的通知或者超時,才會喚醒當前阻塞的執行緒。條件變數要和互斥量配合起來使用。condition variable,配合std unique lock進行wait操作。condition variable an...