我將有問題的代碼減少到了以下值。我有一個類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