BOOST 条件变量使用
代码:
// boost库 条件变量 使用测试 #include <iostream>
#include <boost/thread.hpp>
using namespace std; boost::condition_variable cond; //关联多个线程的条件变量
boost::mutex mutex; //保护共享资源的互斥体
int k=0; //作为共享资源 void func1(const int &id)
{
boost::unique_lock<boost::mutex> lock(mutex); // m->lock(); cout << "thread #hi#" << id << endl; #if 1
static int i = 0;
if(i++ == 1) // 第二个线程执行本函数,我就上锁两次,应该会锁死第二个线程自身。
boost::unique_lock<boost::mutex> lock_again(mutex); // m->lock();
#endif cout << "func1, k = " << k << endl;
while(k<5)
{
cout << "thread #" << id << " : k<5, waiting..." << endl;
cond.wait(lock);
}
cout << "thread #" << id << " : now k>5, printing..." << endl;
}
void func2(const int &id)
{
cout << "thread #hi#" << id << endl;
boost::unique_lock<boost::mutex> lock(mutex);
cout << "func2, k = " << k << endl;
cout << "thread #" << id << " : k will be changed..." << endl;
k+=5; // 模拟操作共享资源 , 在锁的保护下,此时生产者是独占性操作共享资源 cond.notify_all();//唤醒所有的等待线程
//cond.notify_one();//只会唤醒一个等待线程
} int main()
{
// 这个线程应该会顺利执行完毕
boost::thread t1(func1, 1);
boost::this_thread::sleep(boost::posix_time::seconds(1)); // 这个线程内,上锁两次,应该会锁死本线程
boost::thread t2(func1, 2); // 那么主线程还能继续向下执行吗 实测说话
// 实测能继续向下执行,
//实测,使用boost库的互斥锁和linux上的一模一样
cout << "go on" << endl;
boost::this_thread::sleep(boost::posix_time::seconds(1)); // 同理,也锁死
boost::thread t3(func2, 3); t1.join();
t2.join();
t3.join();
cout << "---end---" << endl;
return 0;
}
makefile:
.PHONY: DOIT DOIT:
mips-linux-gnu-g++ -I. thread_pack.cpp -L./lib -lboost_thread -lboost_system -o boost_app
实测结论: 使用基于boost库的互斥锁、条件变量,和基于linux的原生API,效果一模一样。
.
BOOST 条件变量使用的更多相关文章
- Boost条件变量condition_variable_any
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...
- boost 条件变量
// boost 条件变量 // 做个简单的笔记 #include <boost/thread/mutex.hpp> #include <boost/thread/condition ...
- boost库(条件变量)
1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...
- 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题
请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...
- 并发编程入门(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题
请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...
- boost 线程、互斥体、条件变量
1.任何技术都是针对特定场景设计的,也就是说,为了解决某个问题而设计的. 2.考虑下面一种场景:一个小旅馆,只有一个卫生间,有清洁人员,店主人,和旅客.卫生间用完之后,就会自动锁闭,必须取钥匙,才能进 ...
- 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- c++并发编程之条件变量(Condition Variable)
条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...
- Linux多线程同步之相互排斥量和条件变量
1. 什么是相互排斥量 相互排斥量从本质上说是一把锁,在訪问共享资源前对相互排斥量进行加锁,在訪问完毕后释放相互排斥量上的锁. 对相互排斥量进行加锁以后,不论什么其它试图再次对相互排斥量加锁的线程将会 ...
随机推荐
- 【转】PHP面试总结
文章出处:https://www.cnblogs.com/codetao/p/6418127.html
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
- 面试官:哪些场景会产生OOM?怎么解决?
这个面试题是一个朋友在面试的时候碰到的,什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而且这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下 ...
- Linux常用命令详解(2)
aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令详解 1. alias 设置.’查看别名 实例 ...
- VC 编译 MATLAB 的 mex 文件
VC 编译 MATLAB 的 mex 文件mex 文件是 MATLAB 调用其他程序设计语言程序或算法的接口.在 Windows 环境中,mex 文件是扩展文件名为 DLL 的动态链接库,可以在 m ...
- matlab中的多项式计算
在做多项式加法的时候需要做多项式扩展.这里将g1扩展到与f等长 多项式的乘积,是两个多项式之和减1, 多项式求导函数:ployder() 先建立两个多项式,再求a的导函数 在计算两个多项式乘积的导函数 ...
- 网络爬虫:利用selenium,pyquery库抓取并处理京东上的图片并存储到使用mongdb数据库进行存储
一,环境的搭建已经简单的工具介绍 1.selenium,一个用于Web应用程序测试的工具.其特点是直接运行在浏览器中,就像真正的用户在操作一样.新版本selenium2集成了 Selenium 1.0 ...
- shellcode注入原理
我们直接写入可能无法执行 unsigned char data[130] = { 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0xC7, 0x45, 0xF8, 0x00, ...
- lombok使用(给自己看的,只为不要忘记自己用过的技术)
如何使用? 一.1)eclipse使用方法 1. 从项目首页下载lombok.jar 2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境) 2)idea使用方 ...
- kafka学习(一)初识kafka
文章更新时间:2020/06/08 一.简介 定义:kafka是一个分布式,基于zookeeper协调的发布/订阅模式的消息系统,本质是一个MQ(消息队列Message Queue),主要用于大数据实 ...