[TOC]
概述
文章转自:https://www.cnblogs.com/haippy/p/3252041.html
文章参考:https://www.cnblogs.com/haippy/p/3252041.html
头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。
std::condition_variable 类介绍
std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了与条件变量相关的功能, Windows 则参考 MSDN。
当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。
std::condition_variable 对象通常使用 std::unique_lockstd::mutex 来等待,如果需要使用另外的 lockable 类型,可以使用 std::condition_variable_any 类,本文后面会讲到 std::condition_variable_any 的用法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <iostream> #include <thread> #include <mutex> #include <condition_variable>
std::mutex mtx; std::condition_variable cv; bool ready = false;
void do_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]; for (int i = 0; i < 10; ++i) threads[i] = std::thread(do_print_id, i);
std::cout << "10 threads ready to race...\n"; go();
for (auto & th:threads) th.join();
return 0; }
|
std::condition_variable::notify_one() 介绍
唤醒某个等待(wait)线程。如果当前没有等待线程,则该函数什么也不做,如果同时存在多个等待线程,则唤醒某个线程是不确定的(unspecified)。