問題のあるコードを次のように減らしました。独自のスレッドでメンバー関数を実行するクラス C があります。CI のデストラクタで、このスレッドをきれいに終了したい。これは、c が main 内で定義されている限り (1) 正常に機能しますが、グローバル変数 (2) の場合は機能しません。後者の場合、スレッド関数は返されますが、t.join() がハングすることがわかります。
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
using namespace std;
class C
{
public:
C()
{
stop = false;
t = thread(&C::ThreadFunc, this);
}
~C()
{
stop = true;
cv.notify_all();
if (t.joinable())
{
cout << "joining" << endl;
t.join();
cout << "joined" << endl;
}
}
private:
void ThreadFunc()
{
while (true)
{
unique_lock<mutex> lock(m);
cv.wait(lock, [&]{return stop;});
cout << "returning" << endl;
return;
}
}
thread t;
mutex m;
condition_variable cv;
bool stop;
};
C c; // does *not* work (2)
int _tmain(int argc, _TCHAR* argv[])
{
C c; // does work (1)
return 0;
}
グローバル変数を使用する理由は、それが実際には dll の一部であるためです。DLL_PROCESS_DETACH で DllMain からデストラクタがトリガーされると、同じ問題が発生します。この問題の説明と解決策はありますか?