У меня есть класс менеджера, который создает задачи для пула потоков, и каждый поток должен делать обратный вызов после их завершения.
Я использую блокировки для обработки переменных и полей, а также сигналы для обработки межпоточных коммуникаций. Я ищу способ выхода из текущей блокировки () и атомарного ожидания сигнала, что-то вроде SignalAndWait, но для блокировки ().
Код выглядит примерно так:
// ... 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 () не закрывает блокировку (), поэтому любой поток, выполняющий обратный вызов, будет заблокирован.
Я возлагал большие надежды на WaitOne (Int32, bool exitContext), но этот контекст, похоже, касается удаленного взаимодействия и прочего, а не синхронизации.