この単純なスニペットにデッドロックがある理由がわかりません:
#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;
}
編集 コンストラクター set mExit = true を間違って入力しました
編集 2 v110_xp ツールセットで msvc2012 を使用しています。
編集 3 main 内で明示的に gTest.release() を呼び出すと、問題は消えます