线程在销毁包含该线程的对象时调用 thread.detach()

Thread calling thread.detach() on itself when destroying object which contains that thread

本文关键字:线程 调用 thread detach 对象 包含该      更新时间:2023-10-16

我有一个具有属性线程的类。它看起来像这样。

class myClass {
public:
myClass(ClassB * x)  { 
myThread = thread(&myClass::run, this); 
classB = x;
}
~myClass() { myThread.detach(); }
void run() {
while (something) {
// do your work.
}
classB->endThisObject(this); 
}
private:
thread myThread;
ClassB * classB;        
}

我的B类看起来像这样。

ClassB {
public:
endThisObject(myClass * x) { delete x; }
}

所以基本上myThread的最后一个操作是使用另一个对象销毁自己。是奥基还是这会引起很多麻烦?我正在测试我的代码,我没有泄漏,但这对我来说似乎有点不对劲。

除了线程,只需查看以下代码:

B b;
MyClass myclass(&b);

B实例将盲目且无情地调用指向未使用new创建的对象的指针 delete 。

另外,应该注意的是,您的run函数基本上是在调用delete this,这是合法的,但(至少)有点争议(例如,请参阅此处)。

我会给 MyClass 一个start和一个join的方法,如下所示:

void MyClass::start()   
{
myThread = thread(&myClass::run, this);
} 
void MyClass::join()   
{
myThread.join();
} 

这些方式可以从类外部控制线程执行,并以更简单、更安全的方式管理内存:

MyClass myclass;
myclass.start();
myclass.join();
//no need to call delete, here

auto p = std::make_unique<MyClass>();
p->start();
p->join();
//done (and no delete, again)