我将有问题的代码简化为以下内容。我有一个在其自己的线程上运行成员函数的C类。在CI的析构函数中要彻底退出此线程。只要在main(1)中定义了c,它就可以正常工作,但是当它是全局变量(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触发析构函数时,会发生相同的问题。是否有对此问题的解释和解决方案?
这是一个僵局。您持有的锁t
要求在等待终止时t
终止。
说,作为t
的分离过程的一部分,它将对DLL进行一些调用。当存在join
部分连接到该线程的线程(称为的线程)时,DLL如何合理地处理请求?一旦开始分离,直到分离完成,DLL就会处于不一致状态,并且无法明智地处理线程附加和分离操作。
您真的不想在进程无法控制的上下文中尝试加入线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句