[英]Is it OK to check if (this == NULL) in C++ in order to terminate a detached thread's execution?
可以说我创建了一个类X的对象。构造类X时,它在无限循环的函数上创建了一个分离线程。 当类X被销毁时,我想终止(或中断)此分离的线程。 这可能吗? 有没有更好的方法来实现这一目标?
例如:
class X
{
public:
X(){
startThread();
}
virtual ~X(){
}
void myThread()
{
cout << "start of myThread()" << endl;
int loop = 0;
while(true)
{
//std::this_thread::sleep_for(std::chrono::seconds(5));
++loop;
cout << "loop # " << loop << endl;
if(this == NULL){
break;
}
}
cout << "end of myThread()" << endl;
}
void startThread()
{
std::thread example(&X::myThread, this);
example.detach();
}
};
在线程仍在运行时删除X对象绝对是行不通的; 由于仍在运行的线程试图访问现在释放的数据,因此您最终将导致大量崩溃和数据损坏。
您的主线程(即产生myThread线程的线程)需要做的是:
join()返回后,就可以安全地删除X对象了。
(注意:如果您在X类的析构函数中执行上述步骤,则只有从不继承X子类,或者(如果您是X的子类)该线程才永不访问子类中的任何数据成员(例如,如果线程从不调用任何虚拟方法),这是因为在子类析构函数被调用(内部线程仍在运行)与X析构函数被调用(以停止线程)之间存在竞争状态。线程可以从子类的层访问现在释放的数据)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.