用boost共享锁实现读写锁造成死锁问题
2012-12-10 14:47
155 查看
网上很容易找到一个用boost::shared_mutex来作为读写锁的例子:
一直没有怀疑过这个做法,直到最近项目中出现一个死锁问题,查了很久才发现是上面这种写法造成的。
写测试代码还原死锁的情景如下:
情形描述如下:
1:主线程先给m_mutex加读锁。
2:主线程故意睡眠3秒将执行权限切换出去。
3:func1线程获得执行机会,尝试加写锁被挂起。因为主线程已经有一个读锁占用,写锁必须等待这个读锁释放才能进入。
4:主线程睡眠3秒醒来,后续代码想获取一个读锁。由于这个时候已经有一个写锁在等待进入,那么这个读锁排队在写锁后面,同样被挂起。
5:主线程和func1线程都被挂起了,发生死锁。
上面的测试代码,如果中间没有sleep(3000),出现死锁的概率很低,但总归是存在死锁的可能。
总结:
以前一直认为readLock锁和递归锁一样,在同一个线程多次进入没有关系才会造成上面的死锁出现。所以,boost::shared_lock使用要小心,千万不要同一个线程多次进入。
typedef boost::shared_mutex rwmutex; typedef boost::shared_lock<rwmutex> readLock; typedef boost::unique_lock<rwmutex> writeLock;
一直没有怀疑过这个做法,直到最近项目中出现一个死锁问题,查了很久才发现是上面这种写法造成的。
写测试代码还原死锁的情景如下:
#include <boost/thread/shared_mutex.hpp> #include <boost/thread/shared_lock_guard.hpp> #include <boost/thread.hpp> #include <iostream> #include <Windows.h> using namespace std; typedef boost::shared_mutex rwmutex; typedef boost::shared_lock<rwmutex> readLock; typedef boost::unique_lock<rwmutex> writeLock; rwmutex m_mutex; void func1() { writeLock lock1(m_mutex); cout << "fffffffffffffff" << endl; } int main() { { boost::thread tt(func1); readLock lock(m_mutex); // 加读锁 { Sleep(3000); // 故意睡眠3秒将线程切换出去 readLock lock(m_mutex); // 醒来后再次加读锁 cout << "rrrrrrrrrrrrrrrrrr" << endl; } } }
情形描述如下:
1:主线程先给m_mutex加读锁。
2:主线程故意睡眠3秒将执行权限切换出去。
3:func1线程获得执行机会,尝试加写锁被挂起。因为主线程已经有一个读锁占用,写锁必须等待这个读锁释放才能进入。
4:主线程睡眠3秒醒来,后续代码想获取一个读锁。由于这个时候已经有一个写锁在等待进入,那么这个读锁排队在写锁后面,同样被挂起。
5:主线程和func1线程都被挂起了,发生死锁。
上面的测试代码,如果中间没有sleep(3000),出现死锁的概率很低,但总归是存在死锁的可能。
总结:
以前一直认为readLock锁和递归锁一样,在同一个线程多次进入没有关系才会造成上面的死锁出现。所以,boost::shared_lock使用要小心,千万不要同一个线程多次进入。
相关文章推荐
- 关于MFC DLL CWinApp::InitInstance()中创建线程的问题 易造成死锁
- 缺少索引会带来三个问题,限制并发性、影响性能、还有可能造成死锁
- 第六篇:JAVA网络编程之TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- DllMain加载其他DLL造成的死锁问题及其解决办法
- 第十篇:深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
- cURL multi批处理实现及避免cURL multi造成CPU负载过高问题
- JavaSE第一百零四讲:哲学家就餐问题、死锁与使用wait及notify方法实现线程之间的相互通信
- 死锁实现与问题定位
- 实现瀑布流功能解决view复用造成的item高度变化问题。
- 读写锁实现读写者问题
- 主线程中调用WaitForSingleObject函数造成的死锁问题
- Scanf()—键盘缓冲区残余信息和误输入造成程序死锁或出错问题
- java多线程问题中死锁的一个实现
- FreeLibrary造成死锁的问题探讨
- 线程的相关知识、JAVA实现死锁、生产者消费者问题
- Sequelize 事务大并发下造成的死锁问题。
- nginx使用zookeeper造成进程死锁和崩溃问题和解决方案
- 主外键造成ORA-00060死锁问题的解决方案
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)