在堆上创建的boost unique_lock而不是堆栈会导致mingw崩溃

时间:2013-02-10 11:19:20

标签: boost locking unique

有谁知道为什么只能在堆栈上而不是在堆上实例化boost唯一锁定对象?

这非常有效:

boost::unique_lock<boost::mutex> lock1(mutex1);
:
wait_condition.wait(lock1);

但这会导致Windows 7和Windows上的运行时崩溃用mingw编译后的Windows 8:

boost::unique_lock *lock1;
lock1 = new boost::unique_lock<boost::mutex>(mutex1);
:
wait_condition.wait(*lock1);

提前致谢

1 个答案:

答案 0 :(得分:0)

非常感谢Igor的回复。我正在使用boost 1.52.0。 RAII语句让我思考,然后我意识到我之前应该意识到的事情:在堆上创建它意味着即使在退出创建unique_lock的函数之后,锁也永远不会超出范围。当wait返回时,它会重新锁定,而不会在函数返回时解锁基于堆的锁,从而导致死锁。在这种情况下崩溃我的意思是“应用程序冻结,而不是让我关闭它。”

解决了上述问题。但是,我现在有一个新问题:-)在遵循RAII范例并使用堆栈之后,一旦我有25个子线程处于等待状态,我的应用程序仍会崩溃。我不知道为什么。是否有一些Windows,提升或mingw限制超过25个线程等待互斥锁?超过25线程的崩溃比上面更糟糕;它因Windows错误而正常崩溃:“应用程序被迫以意想不到的方式关闭”。少于25个线程不会发生这种情况......