cod*_*ark 0 c++ multithreading destructor this thread-safety
假设我创建了一个类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();
}
};
Run Code Online (Sandbox Code Playgroud)
在线程仍在运行时删除X对象肯定不起作用; 你将最终崩溃和破坏数据,因为仍在运行的线程试图访问现在释放的数据.
你的主线程(即产生myThread线程的线程)需要做的是:
一旦join()返回,您就可以安全地继续删除X对象.
(旁注:如果你在X类的析构函数中执行上述步骤,只要你从不子类化X,或者(如果你做X子类),线程就永远不会访问子类中的任何数据成员(例如,如果线程从不调用任何虚方法).这是因为在子类析构函数被调用(内部线程仍在运行)和X析构函数被调用(停止线程)之间会有一个竞争条件线程可以从子类的层访问现在释放的数据)