一个牛B的关于boost::mutex::scoped_lock死锁问题

hittyo 2011-06-28 08:22:48
如下一个代码:

...
void foo2() {
boost::mutex::scoped_lock lLock(mtx);
std::cout << "foo2" << std::endl;
boost::mutex::scoped_lock lLock2(mtx);
std::cout << "foo2222222" << std::endl;
}

int main(){
boost::thread thread1(&foo2);
thread1.join();
return 0;
}
...




这个实例在正常情况下一定是输出 "foo2"后死锁,但小概率情况会抛出异常
what(): boost::lock_error


百思不得其解下查到这样一则解释:
Checking Locking:试图对本线程已经拥有的mutex加锁会导致boost::lock_error类型的异常抛出。
Unchecking Locking:试图对本线程已经拥有的mutex加锁会导致死锁,快速但不安全。
Unspecified Locking:试图对本线程已经拥有的mutex加锁会导致未定义行为。

而scoped_lock是否属于Unspecified Locking情况?还请牛人赐教!

实在不行只要抛弃使用了,退而使用recursive_mutex递归锁。
...全文
2053 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SH19871122 2013-11-27
  • 打赏
  • 举报
回复
哈哈,估计没写过pthread_mutex_lock?的确很牛逼
xiaolomg 2013-01-02
  • 打赏
  • 举报
回复
这样当然会死锁,修改下就行了:
void foo2() 
{
	{
		boost::mutex::scoped_lock lLock(io_mutex);
		std::cout << "foo2" << std::endl;
	}
	{
		boost::mutex::scoped_lock lLock2(io_mutex);
		std::cout << "foo2222222" << std::endl;
	}

}
hittyo 2011-06-30
  • 打赏
  • 举报
回复
再顶一下讨论这个问题,应该是很常见
hittyo 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qingcairousi 的回复:]

引用 6 楼 hittyo 的回复:

引用 5 楼 qingcairousi 的回复:

另外你的代码里,同一个线程对同一个mtx多次锁本身就应该用recursive的吧?


谢谢这位兄弟,等了好久终于有人指教了。

我的例子用来检测 boost::lock_error 异常的抛出,用来证实,只是重现比较难,个人感觉死锁比较能接受-_- ,抛出异常就非常郁闷了。

文档……
[/Quote]

谢谢了,这是我文档没看透的后果,看来这种锁只能用在简单实现环节,一旦死锁,后果难料。
qingcairousi 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hittyo 的回复:]

引用 5 楼 qingcairousi 的回复:

另外你的代码里,同一个线程对同一个mtx多次锁本身就应该用recursive的吧?


谢谢这位兄弟,等了好久终于有人指教了。

我的例子用来检测 boost::lock_error 异常的抛出,用来证实,只是重现比较难,个人感觉死锁比较能接受-_- ,抛出异常就非常郁闷了。
[/Quote]
文档里都写了unspecific了,你就不能认为这个mtx的行为会是一致的。它有可能随着平台、版本、编译器的变化而变化,别指望它有一致的行为特征。
hittyo 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qingcairousi 的回复:]

mutex和lock是两个概念吧?
scope_lock照样可以使用recursive_mutex吧?
[/Quote]

看了一下手册介绍是使用 boost::recursive_mutex::scoped_lock
hittyo 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qingcairousi 的回复:]

另外你的代码里,同一个线程对同一个mtx多次锁本身就应该用recursive的吧?
[/Quote]

谢谢这位兄弟,等了好久终于有人指教了。

我的例子用来检测 boost::lock_error 异常的抛出,用来证实,只是重现比较难,个人感觉死锁比较能接受-_- ,抛出异常就非常郁闷了。
qingcairousi 2011-06-29
  • 打赏
  • 举报
回复
另外你的代码里,同一个线程对同一个mtx多次锁本身就应该用recursive的吧?
qingcairousi 2011-06-29
  • 打赏
  • 举报
回复
boost的文档已经很明确了,你用的mutex使用的就是unspecific strategy。
qingcairousi 2011-06-29
  • 打赏
  • 举报
回复
mutex和lock是两个概念吧?
scope_lock照样可以使用recursive_mutex吧?
hittyo 2011-06-29
  • 打赏
  • 举报
回复
顶一下,求高人
hittyo 2011-06-28
  • 打赏
  • 举报
回复
我主题定义的mutex 如下:
boost::mutex mtx;

请大家看一下这边有详细说到 锁检测策略
http://www.boost.org/doc/libs/1_34_1/doc/html/thread/concepts.html


64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧