我有一个为线程池生成任务的管理器类,每个线程都应该在完成后进行回调。
我使用锁来处理变量和字段,并使用信号来处理线程间通信。我正在寻找的是一种退出当前 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) 寄予厚望,但该上下文似乎是关于远程处理和其他东西,而不是同步。