セマフォの使用を共有する複数のスレッドがあります。スレッド A は (ロックを使用して) セマフォを保持し、スレッド B と C は同じセマフォで待機しています (これもロックを使用)。スレッドはグローバル変数などを共有します。
スレッド B をシャットダウンするために使用できる C# の手法はありますか? A にフラグを設定し、スレッド B にそのフラグをチェックさせて、セマフォの制御を取得したらすぐに終了させることができますが、スレッド A がセマフォをスレッド B に譲ることを許可する手法を知りません (そしてそれを取得します)。スレッド B が終了したときに戻る) スレッド C が制御を奪うリスクはありません。
この設計上の問題に対処する方法について何か提案はありますか? これに間違ってアプローチしている場合は、必要に応じてプログラムを書き直すことができます。
[編集] コメント投稿者から、私が間違った用語を使用していると指摘されました。コメンターは正しいです-私はクリティカルセクションを使用していますが、すべてが単一のプロセスで実行されていることを考えると、この例ではクリティカルセクションはより一般的な用語「セマフォ」と機能的に同等です。
【追記】詳しく知りたいという方がいらっしゃったので、こちらに。
コード A を実行する複数のスレッドが存在する可能性があります。コード B を実行するスレッドは 1 つだけです。
コード A:
private static Thread workerThread = null;
lock (lockObject)
{
... do some work ...
if (...condition...)
{
if (workerThread != null)
{
// Kill the worker thread and continue only after it is dead.
quitWorkerThread = true;
// Wait for the thread to die.
while (workerThread.IsAlive)
{
Thread.Sleep(50);
}
workerThread = null;
quitWorkerThread = false;
} // if (workerThread != null)
} // if (...condition...)
... do some more work ...
if (...condition...)
{
if (workerThread == null)
{
// Start the worker thread.
workerThread = new Thread(WorkerThread);
workerThread.Start();
} // if (workerThread == null)
} // if (...condition...)
... do even more work ...
} // lock (lockObject)
コード B:
private void WorkerThread()
{
while (true)
{
if (quitWorkerThread)
{
return;
}
Thread.Sleep (2000);
if (quitWorkerThread)
{
return;
}
lock(lockObject)
{
if (quitWorkerThread)
{
return;
}
... do some work ...
} // lock(lockObject)
} // while (true)
} // WorkerThread
アーロンのソリューションの変形が私が使用するものになると思います。私は主に、もう少しエレガントな解決策が利用可能であることを望んでいましたが、このプロジェクトに関する他のすべてと同様に、それはすべてブルートフォースとコーナーケースだと思います:-(.