Если вы вызовите EventWaitHandle.Set () X раз, будет ли он сигнализировать о X потоках, если X потоки еще не начались? - PullRequest
5 голосов
/ 06 мая 2009

Другими словами, у меня есть поток, который запускается и вызывает waitHandle.Set() несколько раз. Затем я запускаю несколько потоков, и каждый ждет этого WaitHandle. Будет ли X из них сигнализироваться где X - количество раз, которое исходная нить назвала waitHandle.Set()?

Есть ли структура, которая поддерживает то, что я пытаюсь выполнить более близко?

Ответы [ 3 ]

9 голосов
/ 06 мая 2009

Может быть, но, вероятно, нет.

Событие может быть установлено или сброшено только в том случае, если сбросить событие нечем, тогда повторные вызовы Set не изменят его состояние, если только это не событие автосброса, и на нем ожидает хотя бы один поток. При событии ручного сброса все потоки, ожидающие (или начинающие ждать), будут освобождены, пока что-то не сбросит событие.

Я думаю, что на самом деле вам нужен семафор, который имеет счетчик и поддерживает установку n раз для освобождения n потоков (даже если некоторые из этих потоков только начинают ждать после некоторого из звонков, чтобы установить).

3 голосов
/ 06 мая 2009

Это зависит от EventResetMode. Если он установлен на EventResetMode.AutoReset, он освободит только один поток. Однако, если это EventResetMode.ManualReset, он освободит все потоки, заблокированные в событии.

Semaphore.Release(Int)

Где Int это число будет один способ сделать это.

1 голос
/ 06 мая 2009

Как сказал Ричард, EventWaitHandles имеют только один флаг и не могут подсчитывать количество вызовов Set. Простое решение добавления переменной count вызывает состояние гонки.

У Уильяма Кемпфа есть статья о том, почему переменные подсчета не работают, и решение с использованием класса .Net Monitor.

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