代码:

  // 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 条件变量使用的更多相关文章

  1. Boost条件变量condition_variable_any

    Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...

  2. boost 条件变量

    // boost 条件变量 // 做个简单的笔记 #include <boost/thread/mutex.hpp> #include <boost/thread/condition ...

  3. boost库(条件变量)

    1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...

  4. 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

    请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...

  5. 并发编程入门(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

    请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...

  6. boost 线程、互斥体、条件变量

    1.任何技术都是针对特定场景设计的,也就是说,为了解决某个问题而设计的. 2.考虑下面一种场景:一个小旅馆,只有一个卫生间,有清洁人员,店主人,和旅客.卫生间用完之后,就会自动锁闭,必须取钥匙,才能进 ...

  7. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  8. c++并发编程之条件变量(Condition Variable)

    条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...

  9. Linux多线程同步之相互排斥量和条件变量

    1. 什么是相互排斥量 相互排斥量从本质上说是一把锁,在訪问共享资源前对相互排斥量进行加锁,在訪问完毕后释放相互排斥量上的锁. 对相互排斥量进行加锁以后,不论什么其它试图再次对相互排斥量加锁的线程将会 ...

随机推荐

  1. loadrunner跑场景时报错Full MDB file. New error messages will be ignored

    这个原因是在controller跑场景时,controller的日志文件占用内存太大 解决办法:先找到controller的日志文件Results——Results Setting——找到日志的路径, ...

  2. 蓝桥杯校内模拟赛Python解答

    @ 目录 1. 15.125GB 2. 约数个数 3. 叶结点数 4. 数字9 5. 数位递增的数 6. 递增三元组 7. 音节判断 8. 长草 9. 序列计数 10. 晚会节目单 1. 15.125 ...

  3. 【转】postgreSQL​之autovacuum性能问题分析(二)

    如上篇文章提到,如果出现了autovacuum的问题,那么这可能是个悲伤的故事.怎么解决? 笔者觉得可以从如下几个方面着手去考虑解决问题,可以避免一些坑.1) 持续观察,是不是autovacuum问题 ...

  4. Powershell编程基础-003-脚本的绝对路径及所在的目录

    在运行脚本的时候,有时候需要通过脚本文件所在目录路径来做一些事, 如脚本5201351.ps1脚本, 常规思路实现>>>>: 1.如果要获取这个脚本所在的绝对路径,可以使用内置 ...

  5. 栈帧的内部结构--操作数栈(Opreand Stack)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

  6. kafka学习(四)kafka安装与命令行调用

    文章更新时间:2020/06/07 一.安装JDK 过程就不过多介绍了... 二.安装Zookeeper 安装过程可以参考此处~ 三.安装并配置kafka Kafka下载地址  http://kafk ...

  7. 刷题[RCTF 2019]Nextphp

    前置知识 一些关于php7.4版本需知: 1.FFI扩展:ffi.cdef 其中还有这样一段话 如果ffi.cdef没有第二个参数,会在全局查找,第一个参数所声明的符号.意思就是其在不传入第二个参数时 ...

  8. MySQL5.7用户创建及权限管理

    一 用户.权限管理 1.1 用户 作用: 登录,管理数据库逻辑对象 定义: 用户名@'主机值' 主机值可以是主机名或IP地址,主机值中允许使用通配符 root@'10.0.0.%' root@'%' ...

  9. linux操作系统网卡漂移导致网络不可用

    1.故障描述 公司有100-150台服务器安装RHEL7.4&中标麒麟7.4系统,为方便编辑配置网卡,使用脚本方式配置为biosname=0,ifname=0,目的是为将en1o2p此类长字符 ...

  10. Android作业0930

    1.使用ListView和Adapter实现购物商城 Android 布局文件 <?xml version="1.0" encoding="utf-8"? ...