スレッドプールのタスクを生成するマネージャー クラスがあり、各スレッドは終了後にコールバックを行うことになっています。
ロックを使用して変数とフィールドを処理し、シグナルを使用してスレッド間通信を処理します。私が探しているのは、現在の lock() を終了し、SignalAndWait のような信号をアトミックに待つ方法ですが、locks() の場合です。
コードは次のようになります。
// ... part of the scheduler
foreach(WorkTask task in worktasks)
{
lock(_syncObj)
{
new Job(task, myCallback); // creates a thread
instanceCount++;
while(instanceCount > _maxConcurrentTasks)
_resetEvent.WaitOne(Timeout.Infinite);
}
}
// .. the callback
void myCallback()
{
lock(_syncObj)
{
instanceCount--;
_resetEvent.Set();
}
}
ここでの問題は、.WaitOne() が lock() を終了しないため、コールバックを実行するスレッドがデッドロックすることです。
私は WaitOne(Int32, bool exitContext) に大きな期待を寄せていましたが、そのコンテキストは同期ではなくリモート処理などに関するものであるようです。