std :: thread.join()死锁

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();导致死锁.

所以是的,你需要在主线程完成之前加入所有线程.