【发布时间】:2014-10-30 19:19:15
【问题描述】:
假设我创建了一个类 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();
}
};
【问题讨论】:
-
不,不行。当“this”为NULL时,“这个对象不存在。因为“this”是指向你所在对象的指针。除非对象不存在,否则它永远不会为NULL。这意味着对象已经被销毁通过析构函数。通过“不存在”,我的意思是你会得到 Seg 错误,或者它可能会工作,但稍后可能会导致 Seg 错误。因为这是指向内存中具有此对象的位置,但这是任何人都可以使用的空闲内存可以使用。
-
呃,
this是一个地址,它不会因为你破坏了那个地址的东西而改变... -
啊,我明白了。在这个例子中,myThread 被分离后,似乎会无限运行(甚至在对象类 X 被销毁之后)。鉴于对象 X 已被销毁,是否有办法让线程 (myThread) 脱离其 while 循环?
-
@user1456962 在对象被销毁后让线程退出是不安全的,因为您可以在线程意识到对象被销毁之前访问不再存在的数据。您必须在对象被销毁之前使线程退出。您可能还可以摆脱类似的情况:确保在对象被销毁之前通知它并停止访问数据,然后在对象被销毁之后自行退出,但我不确定这是否安全线程是一个非静态成员函数。
-
@user1061392,感谢您的回复!这说得通。 this 永远不应该为 NULL,因为它毕竟只是一个地址。当它被销毁时,这将指向其他对象并稍后给出段错误。
标签: c++ multithreading thread-safety this destructor