ACE_Recursive_Thread_Mutex 死锁bug
来源:互联网 发布:看电影软件不付费 编辑:程序博客网 时间:2024/05/15 13:47
ACE_Recursive_Thread_Mutex 的设计目的是为了避免代码中某个线程自己递归对互斥体进行申请而变成死锁的情况
但通过对其介绍文章的阅读 (参考<C++网络编程卷1> 10.6 ACE条件变量类) 发现实现上也可能会因为线程间的竞争ACE_Thread_Mutex 和 ACE_Condition_Thread_Mutex 2个不同资源时形成互锁,代码如下
- int ACE_Recursive_Thread_Mutex::acquire()
- {
- ACE_thread_t t_id = ACE_OS::thr_self();
- ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, lock_, -1);
- if(nesting_level_ == 0){
- owner_id_ = t_id;
- nesting_level_ = 1;
- }
- else if(t_id == owner_id_)
- nesting_level_ ++;
- else{
- while( nesting_level_ > 0)
- lock_available_.wait();
- owner_id_ = t_id;
- nesting_level_ = 1;
- }
- return 0;
- }
在申请递归互斥体的操作上,acquire 先确定调用线程的id ,然后通过scoped locking 技术得到 ACE_Thread_Mutex lock_ 从而得以串行化访问nesting_level_和owner_id_,
ACE_Condition_Thread_Mutex lock_available_ 条件变量实际为真正用来挂起 非所有者线程 ,这些挂起线程需要等待嵌套计数 nesting_level_ 被占用线程降至0且互斥体被释放
出问题的代码在于lock_available_.wai()t前已经通过Ace_Guard 将 lock_ 给占用了, 而其等待的lock_available_.signal() 却需要先取得lock_,代码如下
- int ACE_Recursive_Thread_Mutex::release()
- {
- owner_id_ = 0;
- ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, lock_, -1);
- nesting_level_ --;
- if(nesting_level_ == 0)
- lock_available_.signal();
- return 0;
- }
理想的修改方式是在 lock_available_.wait() 一句前先释放自己占用的 资源 guard.release() 然后再lock_available_.wait() 返回后 再次 guard.acquire() 下。像这样
- int ACE_Recursive_Thread_Mutex::acquire()
- {
- ACE_thread_t t_id = ACE_OS::thr_self();
- ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, lock_, -1);
- if(nesting_level_ == 0){
- owner_id_ = t_id;
- nesting_level_ = 1;
- }
- else if(t_id == owner_id_)
- nesting_level_ ++;
- else{
- while( nesting_level_ > 0)
- {
- guard.release();
- lock_available_.wait();
- guard.acquire();
- }
- owner_id_ = t_id;
- nesting_level_ = 1;
- }
- return 0;
- }
---------------------------------------------------------------------------------------------------------------
补充:
新版的ACE_Condition_Thread_Mutex 实现放在了 ACE_OS::recuersive_mutex_cond_relock ACE_OS::recuersive_mutex_cond_unlock 上,用 ACE_OS::cond_wait((ACE_thread_mutex_t *) &m->lock_available_,(ACE_cond_t*) &m->nesting_mutex_); 同时对2个 互斥体 申请 ,已经解决这个问题了
- ACE_Recursive_Thread_Mutex 死锁bug
- ACE_Recursive_Thread_Mutex 死锁bug
- ACE - ACE_Recursive_Thread_Mutex, ACE_Thread_Mutex, ACE_Condition
- ACE - ACE_Recursive_Thread_Mutex, ACE_Thread_Mutex, ACE_Condition .
- Lockdep定位linux驱动死锁的bug
- 线程递归互斥:ACE_Recursive_Thread_Mutex类
- ACE线程递归互斥:ACE_Recursive_Thread_Mutex类
- 线程递归互斥:ACE_Recursive_Thread_Mutex类
- ACE学习(四)ACE_Recursive_Thread_Mutex与ACE_RW_Thread_Mutex
- Python 官方代码threading模块的一个死锁的bug
- 内存释放时的死锁bug导致lock_wait
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 【技术类】【了解金字塔】金字塔和概视图的关系
- JDBC用PrepareStatement实现增,删,改,查
- RTP协议分析
- 实现CustomDraw绘制ListCtrl子项的关键步骤
- primefaces
- ACE_Recursive_Thread_Mutex 死锁bug
- 重要的shell命令
- u-boot在s3c44b0 上的移植
- OpenGL ES2.0里的3种变量
- 使用 HTML5 开发 WebApp 性能注意点
- iOS blocks - 三個會造成retain cycle的anti patterns
- Android网络开启、关闭整理http://www.cnblogs.com/huazaizai/p/3398675.html
- android手动连接wifi的过程
- JDBC之数据库的增,删,改,查, 搜, 批量执行,获取表结构,获取某一用户下所有的表,滚轴操作的封装