前一篇介绍的条件变量可以进行进程间通信,用来实现生产者/消费者模型。今天介绍的共享互斥量用来实现缓冲区读写模型,与生产者/消费者模型不同的地方是,消费者消费产品后,被消费的产品就不存在了,所以消费者线程也要互斥运行;而缓冲区读取线程读取数据后不删除数据,多个线程可以并行读取。这时使用条件变量也不合适了,就要使用共享互斥变量了。

共享互斥量,顾名思义,既共享,也互斥,读线程之间共享读取数据,使用shared_lock类锁定shared_mutex变量;写线程之间需要独占缓冲区,必须互斥运行,使用unique_lock类锁定shared_mutex变量。这与互斥变量mutex的使用方法不一样,mutex类内部提供了一种lock_guard类即scope_lock类,因此可以用

[cpp] view plaincopy print?
  1. mutex::scope_lock lock(mu);

这样的形式来锁定互斥量,而share_mutex类没有提供这种内部定义的lock_guard类,所以需要直接使用lock_guard对象,语法如下代码:

[cpp] view plaincopy print?
  1. shared_mutex rw_mu;
  2. unique_lock<shared_mutex> ul(rw_mu);
  3. shared_lock<shared_mutex> sl(rw_mu);

下面是《指南》上的例子:

[cpp] view plaincopy print?
  1. private:
  2. int m_x;
  3. shared_mutex rw_mu;
  4. public:
  5. rw_data():m_x(0){}
  6. void write()
  7. {
  8. unique_lock<shared_mutex> ul(rw_mu);
  9. ++m_x;
  10. }
  11. void read(int& x)
  12. {
  13. shared_lock<shared_mutex> sl(rw_mu);
  14. x = m_x;
  15. }
  16. };
  17. void writer(rw_data& d)
  18. {
  19. for(int i = 0; i < 20; ++i)
  20. {
  21. this_thread::sleep(posix_time::millisec(10));
  22. d.write();
  23. }
  24. }
  25. void reader(rw_data& d, mutex& io_mu)
  26. {
  27. int x;
  28. for(int i = 0; i < 10; ++i)
  29. {
  30. this_thread::sleep(posix_time::millisec(5));
  31. d.read(x);
  32. mutex::scoped_lock lock(io_mu);
  33. std::cout << "reader:" << x << std::endl;
  34. }
  35. }
  36. int main()
  37. {
  38. rw_data d;
  39. thread_group pool;
  40. mutex io_mu;
  41. pool.create_thread(bind(reader,ref(d), ref(io_mu)));
  42. pool.create_thread(bind(reader,ref(d), ref(io_mu)));
  43. pool.create_thread(bind(reader,ref(d), ref(io_mu)));
  44. pool.create_thread(bind(reader,ref(d), ref(io_mu)));
  45. pool.create_thread(bind(writer,ref(d)));
  46. pool.create_thread(bind(writer,ref(d)));
  47. pool.join_all();
  48. return 0;
  49. }

boost::shared_mutex相关推荐

  1. boost::shared_mutex相关的测试程序

    boost::shared_mutex相关的测试程序 实现功能 C++实现代码 实现功能 boost::shared_mutex相关的测试程序 C++实现代码 #define BOOST_THREAD ...

  2. Boost读写锁:shared_mutex

    shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比较频繁 ...

  3. Boost库之circular_buffer

    Boost库之circular_buffer 原文:http://blog.csdn.net/byxdaz/article/details/71631470 Boost.Circular_buffer ...

  4. boost asio 异步实现tcp通讯

    一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...

  5. (十一)boost库之多线程间通信

    1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. # ...

  6. 【Boost】boost库中thread多线程详解2——mutex与lock

    1. mutex对象类 mutex类主要有两种:独占式与共享式的互斥量. ▲ 独占式互斥量: mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型 try_mutex: 它是mutex的同义词 ...

  7. 9 C++ Boost 多线程,线程同步

    线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死 ...

  8. c++ boost多线程学习(一)

    本次学习相关资料如下: Boost C++ 库 第 6 章 多线程(大部分代码的来源) Boost程序库完全开发指南 - 深入C++"准"标准库 第三版 罗剑锋著 头文件: #in ...

  9. 使用boost模板函数实现读写锁

    介绍 shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比 ...

最新文章

  1. 人脸识别开源网络笔记
  2. 英文文献中的一些单词
  3. 大数运算(2)——大数加法
  4. 电气实现:蒙特卡洛法 模拟多台电动汽车无序出力负荷和(matlab、python实现)
  5. ADB server didn't ACK * failed to start daemon * 解决方案
  6. [No0000187]可能是把Java内存区域讲的最清楚的一篇文章
  7. docker php示例,Docker PHP 例子
  8. mysql update 联合更新_Mysql update多表联合更新的方法小结
  9. python学习笔记2018-9-18
  10. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型
  11. 「新手向」koa2从起步到填坑
  12. poj 1562 简单 bfs
  13. 2022 基于SpringBoot/SSM的数据库查询平台
  14. 去除CSDN系统通知小红点
  15. c语言小游戏编程弹珠游戏,C/C++知识点之c语言 弹弹球小游戏
  16. 哪一种语言最流行?VB,C++,JAVA? (转)
  17. ISO8583报文协议入门知识
  18. MySQL下载安装 完美卸载
  19. 重大要素改变中的机会选择包括_智慧树青年教师课堂教学比赛微课4答案
  20. 华为OD机试 - 用连续自然数之和来表达整数(Java JS Python)

热门文章

  1. 枚举算法称硬币C语言,【算法系列之枚举】称硬币
  2. Java的主要特性有哪些?
  3. java面试题 sql_Java面试题总结之数据库与SQL语句
  4. python函数代码_如何显示Python函数的代码?
  5. 【学习笔记】JAVA基础——异常处理部分
  6. 游戏教案 电子计算机,计算机模板电子教案.doc
  7. statuml怎么添加用户_UML课后习题答案
  8. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
  9. linux将db2账户添加到组_超实用的shell脚本--Linux安全加固设置,值得收藏
  10. 常用英雄胜率怎么刷_单排刷英雄胜率或者炸鱼方法。