プログラムの終了時に適切にクリーンアップしようとしているので、終了するのを待つように呼び出しjoin()
ています。std::thread
これは単にメインスレッドを永遠にブロックしているように見えますが、ワーカースレッドは次のような (ほぼ) 空のループであるため、その理由はわかりません。
void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}
もちろん、ing のrun
前に false に設定しています。join
今、私はそれがメンバー関数であり、オブジェクトの破壊時に呼び出されることに関係があるのではないかと疑っています。私は次のようなスレッドを作成していrunThread.reset(new thread(&GameLoop::Run, this));
ますrunThread
: 呼び出しは、オブジェクトのデストラクタで行われます。unique_ptr<std::thread>
GameLoop
join()
GameLoop
オブジェクトが破棄される過程にある場合、ループ スレッドが終了できないのではないでしょうか? デバッガーによると、ループ スレッドは の暗い深さに残りますmsvcr120d.dll
。もしそうなら、あなたはそれをどのように扱いますか?
注意:std::thread
ここは初めてです!
更新:これは、デストラクタに参加するための私の呼び出しです:
run = false;
if (runThread->joinable())
{
runThread->join();
}
更新 2:を削除すると、 !join()
によって例外が発生します。~thread()