0

我想知道当对象卡在不同线程中的无限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 方法。此方法的每次迭代都可以更改一些类变量。可以从持有对象的父线程中销毁对象吗?这有没有可能引起问题?

4

2 回答 2

1

如果MyPollingFn曾经显式或隐式地触摸过this(例如通过访问非静态成员变量),那么这段代码将表现出未定义的行为,就像this一个悬空指针一样。

如果它不 touch this,那为什么要让它成为一个非静态成员函数呢?

于 2013-08-07T23:50:04.777 回答
1

有几个可能的问题,包括
1. 要么你会尝试在你的析构函数中加入线程,在这种情况下它会阻塞。


编辑

即如果你添加

MyClass::~MyClass()
{
  myThread.join();
}

并保持MyPollingFunction原样,它永远不会完成,所以joinwill 阻塞。

结束编辑


虽然这段代码没有析构函数,但也许应该。

2. 否则线程会在类消失后尝试“更改一些类变量”。这显然很糟糕。
换一个可能会更好

while(true)

while(!finished)

其中完成的是某种线程安全标志(例如atomic)并将其设置在(当前不存在的)析构函数中。

于 2013-08-07T23:50:24.543 回答