boost::shared_mutex
前一篇介绍的条件变量可以进行进程间通信,用来实现生产者/消费者模型。今天介绍的共享互斥量用来实现缓冲区读写模型,与生产者/消费者模型不同的地方是,消费者消费产品后,被消费的产品就不存在了,所以消费者线程也要互斥运行;而缓冲区读取线程读取数据后不删除数据,多个线程可以并行读取。这时使用条件变量也不合适了,就要使用共享互斥变量了。
共享互斥量,顾名思义,既共享,也互斥,读线程之间共享读取数据,使用shared_lock类锁定shared_mutex变量;写线程之间需要独占缓冲区,必须互斥运行,使用unique_lock类锁定shared_mutex变量。这与互斥变量mutex的使用方法不一样,mutex类内部提供了一种lock_guard类即scope_lock类,因此可以用
- mutex::scope_lock lock(mu);
这样的形式来锁定互斥量,而share_mutex类没有提供这种内部定义的lock_guard类,所以需要直接使用lock_guard对象,语法如下代码:
- shared_mutex rw_mu;
- unique_lock<shared_mutex> ul(rw_mu);
- shared_lock<shared_mutex> sl(rw_mu);
下面是《指南》上的例子:
- private:
- int m_x;
- shared_mutex rw_mu;
- public:
- rw_data():m_x(0){}
- void write()
- {
- unique_lock<shared_mutex> ul(rw_mu);
- ++m_x;
- }
- void read(int& x)
- {
- shared_lock<shared_mutex> sl(rw_mu);
- x = m_x;
- }
- };
- void writer(rw_data& d)
- {
- for(int i = 0; i < 20; ++i)
- {
- this_thread::sleep(posix_time::millisec(10));
- d.write();
- }
- }
- void reader(rw_data& d, mutex& io_mu)
- {
- int x;
- for(int i = 0; i < 10; ++i)
- {
- this_thread::sleep(posix_time::millisec(5));
- d.read(x);
- mutex::scoped_lock lock(io_mu);
- std::cout << "reader:" << x << std::endl;
- }
- }
- int main()
- {
- rw_data d;
- thread_group pool;
- mutex io_mu;
- pool.create_thread(bind(reader,ref(d), ref(io_mu)));
- pool.create_thread(bind(reader,ref(d), ref(io_mu)));
- pool.create_thread(bind(reader,ref(d), ref(io_mu)));
- pool.create_thread(bind(reader,ref(d), ref(io_mu)));
- pool.create_thread(bind(writer,ref(d)));
- pool.create_thread(bind(writer,ref(d)));
- pool.join_all();
- return 0;
- }
boost::shared_mutex相关推荐
- boost::shared_mutex相关的测试程序
boost::shared_mutex相关的测试程序 实现功能 C++实现代码 实现功能 boost::shared_mutex相关的测试程序 C++实现代码 #define BOOST_THREAD ...
- Boost读写锁:shared_mutex
shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比较频繁 ...
- Boost库之circular_buffer
Boost库之circular_buffer 原文:http://blog.csdn.net/byxdaz/article/details/71631470 Boost.Circular_buffer ...
- boost asio 异步实现tcp通讯
一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...
- (十一)boost库之多线程间通信
1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. # ...
- 【Boost】boost库中thread多线程详解2——mutex与lock
1. mutex对象类 mutex类主要有两种:独占式与共享式的互斥量. ▲ 独占式互斥量: mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型 try_mutex: 它是mutex的同义词 ...
- 9 C++ Boost 多线程,线程同步
线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死 ...
- c++ boost多线程学习(一)
本次学习相关资料如下: Boost C++ 库 第 6 章 多线程(大部分代码的来源) Boost程序库完全开发指南 - 深入C++"准"标准库 第三版 罗剑锋著 头文件: #in ...
- 使用boost模板函数实现读写锁
介绍 shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比 ...
最新文章
- 人脸识别开源网络笔记
- 英文文献中的一些单词
- 大数运算(2)——大数加法
- 电气实现:蒙特卡洛法 模拟多台电动汽车无序出力负荷和(matlab、python实现)
- ADB server didn't ACK * failed to start daemon * 解决方案
- [No0000187]可能是把Java内存区域讲的最清楚的一篇文章
- docker php示例,Docker PHP 例子
- mysql update 联合更新_Mysql update多表联合更新的方法小结
- python学习笔记2018-9-18
- 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型
- 「新手向」koa2从起步到填坑
- poj 1562 简单 bfs
- 2022 基于SpringBoot/SSM的数据库查询平台
- 去除CSDN系统通知小红点
- c语言小游戏编程弹珠游戏,C/C++知识点之c语言 弹弹球小游戏
- 哪一种语言最流行?VB,C++,JAVA? (转)
- ISO8583报文协议入门知识
- MySQL下载安装 完美卸载
- 重大要素改变中的机会选择包括_智慧树青年教师课堂教学比赛微课4答案
- 华为OD机试 - 用连续自然数之和来表达整数(Java JS Python)
热门文章
- 枚举算法称硬币C语言,【算法系列之枚举】称硬币
- Java的主要特性有哪些?
- java面试题 sql_Java面试题总结之数据库与SQL语句
- python函数代码_如何显示Python函数的代码?
- 【学习笔记】JAVA基础——异常处理部分
- 游戏教案 电子计算机,计算机模板电子教案.doc
- statuml怎么添加用户_UML课后习题答案
- Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
- linux将db2账户添加到组_超实用的shell脚本--Linux安全加固设置,值得收藏
- 常用英雄胜率怎么刷_单排刷英雄胜率或者炸鱼方法。