标准化条件变量 -- condition_variable
std::condition_variable是條件變。Linux下使用 Pthread庫(kù)中的 pthread_cond_*()?函數(shù)提供了與條件變量相關(guān)的功能。和pthread_cond_*()一樣,我們可以使用條件變量(condition_variable)實(shí)現(xiàn)多個(gè)線程間的同步操作;當(dāng)條件不滿足時(shí),相關(guān)線程被一直阻塞,直到某種條件出現(xiàn),這些線程才會(huì)被喚醒。C++11通過std::condition_variable,對(duì)于條件變量進(jìn)行了統(tǒng)一化,標(biāo)準(zhǔn)化。
condition_variable 的用法很簡(jiǎn)單,這里就不一一介紹了。關(guān)鍵用法如下圖所示:
我們來看看官方的解釋:
condition_variable 類是同步原語,能用于阻塞一個(gè)線程,或同時(shí)阻塞多個(gè)線程,直至另一線程修改共享變量(條件)并通知 condition_variable 。
有意修改變量的線程必須:
獲得?std::mutex?(常通過?std::lock_guard?)
在保有鎖時(shí)進(jìn)行修改
在?std::condition_variable?上執(zhí)行?notify_one?或?notify_all?(不需要為通知保有鎖)
即使共享變量是原子的,也必須在互斥下修改它,以正確地發(fā)布修改到等待的線程。
任何有意在 std::condition_variable 上等待的線程必須:
在與用于保護(hù)共享變量者相同的互斥上獲得?std::unique_lock<std::mutex>
執(zhí)行下列之一:
檢查條件,是否為已更新或提醒它的情況
執(zhí)行 wait 、 wait_for 或 wait_until ,等待操作自動(dòng)釋放互斥,并懸掛線程的執(zhí)行。
condition_variable 被通知時(shí),時(shí)限消失或虛假喚醒發(fā)生,線程被喚醒,且自動(dòng)重新獲得互斥。之后線程應(yīng)檢查條件,若喚醒是虛假的,則繼續(xù)等待。
-
-
或者
-
-
使用?wait?、?wait_for?及?wait_until?的有謂詞重載,它們包攬以上三個(gè)步驟
std::condition_variable 只可與 std::unique_lock<std::mutex>?一同使用;此限制在一些平臺(tái)上允許最大效率。std::condition_variable_any 提供可與任何基本可鎖定?(BasicLockable)?對(duì)象,例如 std::shared_lock 一同使用的條件變量。
condition_variable容許:
?wait 、 wait_for 、 wait_until 、 notify_one 及 notify_all 成員函數(shù)的同時(shí)調(diào)用。
類 std::condition_variable 是標(biāo)準(zhǔn)布局類型?(StandardLayoutType)?。它非可復(fù)制構(gòu)造?(CopyConstructible)?、可移動(dòng)構(gòu)造?(MoveConstructible)?、可復(fù)制賦值?(CopyAssignable)?或可移動(dòng)賦值?(MoveAssignable)?。
下面看一下官網(wǎng)的例子:
#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <condition_variable> // std::condition_variablestd::mutex mtx; std::condition_variable cv; bool ready = false;void print_id (int id) {std::unique_lock<std::mutex> lck(mtx);while (!ready) cv.wait(lck);// ...std::cout << "thread " << id << '\n'; }void go() {std::unique_lock<std::mutex> lck(mtx);ready = true;cv.notify_all(); }int main () {std::thread threads[10];// spawn 10 threads:for (int i=0; i<10; ++i)threads[i] = std::thread(print_id,i);std::cout << "10 threads ready to race...\n";go(); // go!for (auto& th : threads) th.join();return 0; } Output:10 threads ready to race...thread 2thread 0thread 9thread 4thread 6thread 8thread 7thread 5thread 3thread 1總結(jié)
以上是生活随笔為你收集整理的标准化条件变量 -- condition_variable的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: std::future和std::pro
- 下一篇: 用C++11 实现 thread poo