【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)
来源:互联网 发布:用手机端口怎么查询 编辑:程序博客网 时间:2024/06/14 05:48
如果一个线程中可能在执行中需要再次获得锁的情况(例子:test_thread_deadlock),按常规的做法会出现死锁。
此时就需要使用递归式互斥量boost::recursive_mutex,例子(test_thread_recursivelock)来避免这个问题。boost::recursive_mutex不会产生上述的死锁问题,只是是增加锁的计数,但必须确保你unlock和lock的次数相同,其他线程才可能锁这个mutex
- namespace {
- boost::mutex g_mutex;
- void threadfun1()
- {
- PRINT_DEBUG("enter threadfun1...");
- boost::lock_guard<boost::mutex> lock(g_mutex);
- PRINT_DEBUG("execute threadfun1...");
- }
- void threadfun2()
- {
- PRINT_DEBUG("enter threadfun2...");
- boost::lock_guard<boost::mutex> lock(g_mutex);
- threadfun1();
- PRINT_DEBUG("execute threadfun2...");
- }
- }
- namespace {
- boost::recursive_mutex g_rec_mutex;
- void threadfun3()
- {
- PRINT_DEBUG("enter threadfun3...");
- boost::recursive_mutex::scoped_lock lock(g_rec_mutex);
- // 当然这种写法也可以
- // boost::lock_guard<boost::recursive_mutex> lock(g_rec_mutex);
- PRINT_DEBUG("execute threadfun3...");
- }
- void threadfun4()
- {
- PRINT_DEBUG("enter threadfun4...");
- boost::recursive_mutex::scoped_lock lock(g_rec_mutex);
- threadfun3();
- PRINT_DEBUG("execute threadfun4...");
- }
- }
- // 死锁的例子
- void test_thread_deadlock()
- {
- threadfun2();
- }
- // 利用递归式互斥量来避免这个问题
- void test_thread_recursivelock()
- {
- threadfun4();
- }
阅读全文
0 0
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex
- 【Boost】boost库中thread多线程详解5——谈谈线程中断
- 【Boost】boost库中thread多线程详解5——谈谈线程中断
- 【Boost】boost库中thread多线程详解5——谈谈线程中断
- boost库中thread多线程详解5——谈谈线程中断
- boost库中thread多线程详解5——谈谈线程中断
- 【Boost】boost库中thread多线程详解1——thread入门与简介
- 【Boost】boost库中thread多线程详解2——mutex与lock
- 【Boost】boost库中thread多线程详解3——细说lock_guard
- 【Boost】boost库中thread多线程详解6——线程组简单例子
- 【Boost】boost库中thread多线程详解7——wait与timed_wait简单例子
- 【Boost】boost库中thread多线程详解2——mutex与lock
- 【Boost】boost库中thread多线程详解3——细说lock_guard
- 【Boost】boost库中thread多线程详解6——线程组简单例子
- 【Boost】boost库中thread多线程详解7——wait与timed_wait简单例子
- Power Designer逆向工程导入Oracle表,转为模型加注释
- Mac电脑使用:通过Mac电脑导出iPhone手机里面的照片(不是iTunes导出照片的方法)
- 彻底解决pycharm输入法中文支持问题
- Vsiual Studio自动生成版本号的一种方法
- 基于httpclient的post json方法
- 【Boost】boost库中thread多线程详解4——谈谈recursive_mutex(递归式互斥量)
- 工具代码(一):MD5加密
- (转载)CentOS一键安装pptpd服务脚本
- 如何查看linux系统是否禁ping
- 云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)
- 从源码剖析一个Spark WordCount Job执行的全过程
- Java并发编程:Timer和TimerTask
- tortoisegit如何退回原来的版本及回退远端
- linux多线程调用同一个函数解析