これが私の状況を説明するための疑似コードです。QThreads を使用していますが、解決策は Qt に依存しない場合があります。
class ResourceOwner
{
// Spawns worker on new QThread, initiates Worker::doWork()
void spawnWorker(resource); {...}
void deleteResourceSafely(); // How do you implement this function?
private:
Resource *resource;
Worker *worker;
}
class Worker
{
void doWork() { while(true) resource->doSomething(); }
void cleanupSelf() {...};
private:
Resource *resource;
}
void main()
{
ResourceOwner owner();
owner.spawnWorker();
...
// Some time later after enough work has been done
owner.deleteResourceSafely();
}
削除するときはresource
、ワーカーをシャットダウンする必要があります。ただし、 はWorker
にアクセス中の可能性がありますresource
。
resource
を削除しただけでは、無効Worker
なメモリにアクセスするためクラッシュします。Worker
が属するスレッドを停止することはできますが、Worker
適切にクリーンアップする機会はありません。
Worker
では、の機能を中断doWork()
して、自分自身をクリーンアップし、アクセスを停止するように指示するにはどうすればよいresource
でしょうか。