std::condition_variable 使用

#include <iostream> // std::cout

#include <thread>                // std::thread

#include <mutex>                // std::mutex, std::unique_lock

#include <condition_variable>    // std::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);

std::cout << "begin thread " << id << '\n';

while (!ready)

{

/*

如果标志位不为 true, 则等待...

当前线程被阻塞, 当全局标志位变为 true 之后, 线程被唤醒, 继续往下执行打印线程编号id.

*/

std::cout << "wait: " << id << std::endl;

cv.wait(lck);

}

std::cout << "thread " << id << '\n';

}

void go()

{

std::unique_lock <std::mutex> lck(mtx);

std::this_thread::sleep_for(std::chrono::milliseconds(2000));

ready = true; // 设置全局标志位为 true.

//cv.notify_all(); // 唤醒所有线程.

cv.notify_one();//

}

int main()

{

std::thread threads[10];

// spawn 10 threads:

for (int i = 0; i < 10; ++i)

threads[i] = std::thread(do_print_id, i);

std::cout << "10 threads ready to race...\n";

getchar();

go(); // go!

for (auto& th : threads)

th.join();

getchar();

return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • <condition_variable > 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::co...
    张霸天阅读 3,811评论 1 0
  • include <iostream> include "GL3TestCase.h" include "TestC...
    SMSM阅读 305评论 0 0
  • 最近是恰好写了一些c++11多线程有关的东西,就写一下笔记留着以后自己忘记回来看吧,也不是专门写给读者看的,我就想...
    编程小世界阅读 2,559评论 1 2
  • 完整代码如下: #include #include <condition_variable> #include <...
    姬权阅读 655评论 0 0
  • 生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源。本文将就四种情况...
    张霸天阅读 291评论 0 0