我有一个类,它有一个方法来启动一个线程,该线程以预定义的时间间隔Start
执行虚拟。ThreadFunction
该Stop
方法设置一个事件并等待线程终止(通过WaitForSingleObject
线程句柄上的 a )。
在 的析构函数中MyThread
,我调用了该Stop
方法。因此,每当我删除实例时,我确信线程在删除返回之前已停止。
class MyThread
{
void Start();
void Stop();
~MyThread() { Stop(); }
virtual VOID ThreadFunction() { }
};
接下来我有一个派生自的类MyThread
:
class A : MyThread
{
virtual VOID ThreadFunction()
{
for (int i = 0; i < 1000; i++)
TestFunction();
}
void TestFunction() { // Do something }
};
考虑这段代码:
A a = new A();
a->Start();
delete a;
问题是在调用析构函数之前delete a
会先调用析构函数吗?因此,如果线程正在执行中的,则该方法将在被破坏后被调用。当调用已破坏的实例时,这可能会导致访问冲突。A
MyThread
for-loop
ThreadFunction
Stop
a
ThreadFunction
TestFunction
一种解决方案是向class A
调用该Stop
方法的析构函数添加一个析构函数,如下所示:
class A : MyThread
{
~A()
{
Stop();
}
}
但是因为我有一个更复杂的类层次结构,它涉及多个继承的类,这意味着我必须Stop
在每个析构函数中调用该方法,这将导致 Stop 方法被调用很多次,而只有一个需要删除的实例.
有没有其他方法可以解决这个问题?