これが私の状況を説明するための疑似コードです。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でしょうか。