2

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

这完美地工作:

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

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

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

提前致谢

4

1 回答 1

0

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

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

于 2013-02-16T22:51:59.977 回答