1

スレッドプールのタスクを生成するマネージャー クラスがあり、各スレッドは終了後にコールバックを行うことになっています。

ロックを使用して変数とフィールドを処理し、シグナルを使用してスレッド間通信を処理します。私が探しているのは、現在の 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) に大きな期待を寄せていましたが、そのコンテキストは同期ではなくリモート処理などに関するものであるようです。

4

1 に答える 1

3

ではなくイベントプリミティブを使用する理由はありますMonitor.Wait/Pulse/PulseAllか? Monitor.Waitアトミックにロックを解放して待機し、戻る前にロックを再取得します。詳細については、スレッドに関する記事を参照してください。

于 2008-11-19T14:10:24.783 に答える