elv*_*kaj 9 c++ multithreading
我不明白为什么这个简单的代码片段有死锁:
#include <atomic>
#include <thread>
#include <memory>
using namespace std;
class Test {
public:
Test() : mExit( false )
{
mThread = thread( bind( &Test::func, this ) );
}
~Test()
{
if ( mThread.joinable() )
{
mExit = true;
mThread.join();
}
}
private:
void func()
{
while ( !mExit )
{
// do something
}
}
private:
atomic< bool > mExit;
thread mThread;
};
typedef unique_ptr< Test > TestPtr;
TestPtr gTest;
int main()
{
gTest = TestPtr( new Test );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑 我键入错误的contstructor设置mExit = true
编辑2 我正在使用msvc2012和v110_xp工具集.
编辑3 如果我明确地在main中调用gTest.release(),问题就会消失
小智 7
我刚刚遇到这个问题,所以我发布了其他人的真实答案.
在至少Visual Studio中,有一个"出口锁定",当一个线程进入出口代码(即,之后被锁定main()
主线程,并且之后f()
对std::thread(f)
).
由于您的Test类仅在main()
完成后被销毁,因此"退出锁定"被锁定.只有这样你mExit = true;
才能完成并允许另一个线程完成.这个其他线程然后等待获得主线程已经采用的"退出锁定",而主线程等待mThread.join();
导致死锁.
所以是的,你需要在主线程完成之前加入所有线程.
归档时间: |
|
查看次数: |
4052 次 |
最近记录: |