一、条件变量的引入

std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待。当互斥操作不够用而引入的。比如,线程可能需要等待某个条件为真才能继续执行,而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。所以,condition_variable实例被创建出现主要就是用于唤醒等待线程从而避免死锁。std::condition_variable的 notify_one()用于唤醒一个线程;notify_all() 则是通知所有线程。

二、下面是一个引用的例子

假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中确实有数据,由于这个队列是线程间共享的,所以,需要使用互斥锁进行保护,一个线程在往队列添加数据的时候,另一个线程不能取,反之亦然。
一般的:

std::deque<int> q;
std::mutex mu; void function_1() {
int count = ;
while (count > ) {
std::unique_lock<std::mutex> locker(mu);
q.push_front(count);
std::cout << "t1 put a value : " << count << std::endl;
locker.unlock();
std::this_thread::sleep_for(std::chrono::seconds());
count--;
}
} void function_2() {
int data = ;
while (data != ) {
std::unique_lock<std::mutex> locker(mu);
if (!q.empty()) {
data = q.back();
q.pop_back();
locker.unlock();
std::cout << "t2 got a value from t1: " << data << std::endl;
}
else {
locker.unlock();
}
}
}
int main() {
std::thread t1(function_1);
std::thread t2(function_2);
t1.join();
t2.join();
return ;
}
std::this_thread::sleep_for(std::chrono::seconds(1));表示延时1s,所以这个生产的过程是很慢的;function_2函数是消费者,存在着一个while循环,只有在接收到表示结束的数据的时候,才会停止,每次循环内部,都是先加锁,判断队列不空,然后就取出一个数,最后解锁。所以说,在1s内,做了很多无用功!这样的话,单核CPU占用率会很高,可能达到100%。
// threadTest.cpp: 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <string>
#include <fstream>
#include <deque>
#include <condition_variable> using namespace std; std::deque<int> q;
std::mutex mu;
std::condition_variable cond; void function_1()
{
int count = ;
while (count>)
{
std::unique_lock<mutex> locker(mu);
q.push_back(count);
locker.unlock();
cond.notify_all();
std::this_thread::sleep_for(chrono::seconds());
count--;
} } void funciton_2()
{
int data = ;
while (data != )
{
std::unique_lock<mutex> locker(mu);
cond.wait(locker, [](){return !q.empty(); }); // while(q.empty()) {cond.wait(locker); }// Unlock mu and wait to be notified 等同写法
        data = q.back(); 
q.pop_back();
locker.unlock();
cout << "t2 get a value form t1 " << data << endl; }
} int main() {
thread t1(function_1);
thread t2(funciton_2);
t1.join();
t2.join();
std::getchar(); return ; }

多线程一----多线程的应用

多线程二----简单线程管理

多线程三----数据竞争和互斥对象

多线程四----死锁和防止死锁

多线程五----unick_lock和once_flag

多线程六----条件变量

多线程七----线程间通信

最新文章

  1. 第3月第11天 vs2005调试 ace编译
  2. windows7内核驱动开发试验环境配置
  3. [转]PHP5 session 详解
  4. [设计模式] javascript 之 单件模式
  5. 利用powerdesigner反向数据库结构,生成ER图
  6. mysql kill操作
  7. 淘宝数据库连接池 druid 性能评测
  8. Python 项目实践二(生成数据)第一篇
  9. 洛谷 P1439 【模板】最长公共子序列
  10. 华为Python 算法面试题
  11. MAC 开启与关闭SIP
  12. C++打开剪切板,获取剪切板数据
  13. Python 函数的嵌套
  14. win10 解决 WMI Provider Host 占用CPU过高问题
  15. PlanetTogether APS安装与配置
  16. 在idea中使用@Test注解报错的解决方案
  17. BZOJ 4260 Codechef REBXOR(字典树)
  18. AD属性常量类
  19. JavaScript获取时间戳与时间戳转化
  20. 最小二乘法及C语言实现

热门文章

  1. 【朝花夕拾】Android性能篇之(一)序言及JVM
  2. javascript深入理解js闭包(转载)
  3. IntelliJ IDEA上操作GitHub
  4. js内存深入学习(一)
  5. js中json的添加和指定位置的删除
  6. C# Redis 过期机制不生效问题
  7. 利用 c# linq 实现跨数据库的联合查询
  8. Linux CentOS设置定时重启:crontab
  9. 【开源】Netty轻松实现聊天室,附带数据记录,聊天历史
  10. LIMIT与OFFSET的使用