我想知道当对象被卡在另一个线程中的无限while循环中时,在对象上调用析构函数时会发生什么。
// Main thread creates the object
MyClass _obj = new MyClass():
// doing some stuff
delete _obj;
其中,
MyClass::MyClass()
{
// Start a thread which calls MyClass::MyPollingFn()
}
MyClass:: MyPollingFn()
{
// runs in new child thread
while(true)
{
// doing some work
// sleep(5 seconds)
}
}
说明: MyClass有一个类对象,它创建一个线程并在无限循环中运行MyPollingFn方法。此方法的每次迭代都可以更改某些类变量。是否可以从保存对象的父线程中销毁对象?是否有可能出现问题?
答案 0 :(得分:1)
如果MyPollingFn
显式或隐式地(例如通过访问非静态成员变量)触及this
,则此代码将显示未定义的行为,因为this
将成为悬空指针
如果它没有触及this
,那么为什么要使它成为非静态成员函数呢?
答案 1 :(得分:0)
有几个可能的问题,包括
1.你要么试着加入你的析构函数中的线程,在这种情况下它会阻塞。
修改强>
即。如果你添加
MyClass::~MyClass()
{
myThread.join();
}
并按原样保留MyPollingFunction
,它永远不会完成,因此join
会阻止。
结束修改
虽然这段代码没有析构函数,但也许它应该。
2.或者线程将在类消失后尝试“更改某些类变量”。
这显然很糟糕。
改变
while(true)
到
while(!finished)
其中,finish是某种线程安全标志(例如atomic
)并将其设置在(当前不存在的)析构函数中。