SignalAndWait для блокировки контекста - PullRequest
1 голос
/ 19 ноября 2008

У меня есть класс менеджера, который создает задачи для пула потоков, и каждый поток должен делать обратный вызов после их завершения.

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

1 Ответ

3 голосов
/ 19 ноября 2008

Есть ли причина для использования примитивов событий, а не Monitor.Wait/Pulse/PulseAll? Monitor.Wait атомно снимает блокировку и ждет, повторно блокируя, прежде чем она вернется. См. мою статью о потоке для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...