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/PulseAllMonitor.Wait原子地释放锁并等待,在它返回之前重新获取锁。有关更多详细信息,请参阅我的线程文章

于 2008-11-19T14:10:24.783 回答