std::condition_variable
/*
std::condition_variable 提供了两种 wait() 函数。当前线程调用 wait() 后将被阻塞(此时当前线程应该获得了锁(mutex),不妨设获得锁 lck),直到另外某个线程调用 notify_* 唤醒了当前线程。
在线程被阻塞时,该函数会自动调用 lck.unlock() 释放锁,使得其他被阻塞在锁竞争上的线程得以继续执行。另外,一旦当前线程获得通知(notified,通常是另外某个线程调用 notify_* 唤醒了当前线程),wait() 函数也是自动调用 lck.lock(),使得 lck 的状态和 wait 函数被调用时相同。
在第二种情况下(即设置了 Predicate),只有当 pred 条件为 false 时调用 wait() 才会阻塞当前线程,并且在收到其他线程的通知后只有当 pred 为 true 时才会被解除阻塞
*/
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <condition_variable>
std::vector<int> vec;
std::mutex mu;
std::condition_variable cv;
int countt = ;
bool ready = false;
using namespace std;
void fun(int n)
{
std::unique_lock<std::mutex> loc(mu);
while (!ready)
{
cv.wait(loc);//依照上面的理解:wait操作线程被阻塞,wait操作会将mutex解锁,导致其他的线程都阻塞在这,当其他线程调用notify时,线程解除阻塞,但开始上锁
} int num = ;
while (num--)
{
cout<<n<<"--------"<<num<<endl;
}
} void go()
{
std::unique_lock<std::mutex> lo(mu);
ready = true;
cv.notify_all();//通知所有阻塞的线程进入运行状态
} int main()
{
std::thread th[];
for (int i = ; i < ; ++i)
{
th[i] = std::thread(fun, i);
}
//此时5个线程都开始运行,但都被阻塞住了
go();
for (auto& t:th)
{
t.join();
}
system("pause");
return ;
}
具体参考http://www.cnblogs.com/haippy/p/3252041.html
cv.wait(loc)会解锁,此时阻塞在go函数的线程和fun里面的线程也可以运行,我实在没想通,感觉这个例子举得不好。
std::condition_variable的更多相关文章
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- C++11并发——多线程条件变量std::condition_variable(四)
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...
- 基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...
- std::condition_variable(二)
#include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::yie ...
- 转 C++11 并发指南std::condition_variable详解
之前看过,但是一直没有怎么用就忘了,转一篇别人的文字记录下来 本文将介绍 C++11 标准中 <condition_variable> 头文件里面的类和相关函数. <conditio ...
- std::condition_variable(3)复习
#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> ...
- std::condition_variable(2)复习
#include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::yie ...
- std::condition_variable(复习)
#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> ...
- C++11 并发指南五(std::condition_variable 详解)(转)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
随机推荐
- vsCode 添加浏览器调试和js调试的方法总结
vsCode 添加浏览器调试和js调试的方法 1.直接按F5可以调试的方法或者点击运行按钮(可以直接运行html文件或者js文件) 在launch.json文件中的配置如下: { " ...
- 安卓编译报错:Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
今天在编译别人的project时遇到了这个错误,心想应该不是代码的问题.网上搜了一下,应该是sdk版本设置的问题,要设置为最新sdk版本才可以. 解决办法就是修改project.properties里 ...
- Python Unicode 转换 字符串
estimate_price = "\u00a340\u00a0\u00a0-\u00a060" sold_price = "Sold for \u00a345" ...
- macbook中使用彩色的ls
1.首先,macbook中原装的ls和gnu的ls是不相同的,所以,要下载安装正牌ls brew install coreutils //gnu ls 在里面 2.因为和mac的ls有冲突,所以,co ...
- 每日英语:Online Education a New Frontier in China
In a country as obsessed with education as China, it makes sense that online teaching has huge poten ...
- 华中农业大学校赛--c The Same Color
Problem C: The Same Color Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 993 Solved: 595[Submit][St ...
- WP架构设计(一)MVVM回顾
[MVVM的定义] MVVM的目的是什么? 简单总结起来一句话:分离UI逻辑和业务逻辑.这一点和被大家熟知的MVP和MVC是一致的. 下面详细来说明下这个问题,下面一段英文来自Msdn ...
- DevExpress v15.2新功能介绍视频(25集全)
DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...
- Spring Mvc中DispatcherServlet和Servlet的区别小结
在web开发过程中开始接触的是servlet,用来处理用户请求.这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架.既然这么受欢迎肯定有它的优点,spring框架在原来的 ...
- Hive三种不同的数据导出的方式
转自:http://blog.chinaunix.net/uid-27177626-id-4653808.html Hive三种不同的数据导出的方式,根据导出的地方不一样,将这些方法分为三类:(1)导 ...