定義済みの間隔でStart
仮想を実行するスレッドを開始するメソッドを持つクラスがあります。ThreadFunction
メソッドはイベントを設定し、スレッドが終了するまで (スレッド ハンドルStop
の a によって) 待機します。WaitForSingleObject
のデストラクタで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
各デストラクタでメソッドを呼び出す必要があることを意味し、その結果、削除する必要がある 1 つのインスタンスだけに対して Stop メソッドが何度も呼び出されることになります。 .
この問題に取り組む他の方法はありますか?