문제가되는 코드가 다음과 같이 줄어 들었습니다. 나 자신의 스레드에서 멤버 함수를 실행하는 클래스 C 있습니다. C의 소멸자에서이 스레드를 완전히 종료하고 싶습니다. 이것은 c가 main (1) 내에 정의되어있는 한 정상적으로 작동하지만 글로벌 변수 (2)가 아닌 경우에는 작동합니다. 후자의 경우 스레드 함수가 반환되지만 t.join()이 중단된다는 것을 알 수 있습니다.전역 변수의 소멸자에서 호출 될 때 thread.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에서 소멸자가 트리거되면 같은 문제가 발생합니다. 이 문제에 대한 설명 및 해결책이 있습니까?
'C :: stop'은'atomic'이어야합니다. 설정하기 전에 소멸자에서 뮤텍스를 잠글 필요가 있습니다. 그렇지 않으면 데이터 경합이 생깁니다. –
@Jonathan : 나는 그것을 시도했지만 그것이 문제의 원인이 아닙니다. – Emile