2009-05-05 1 views
5

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

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

ответ

9

Возможно, но, вероятно, нет.

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

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

+0

Да, я хочу семафор. Я вспомнил о механизме, но не о названии. Прошло некоторое время с тех пор, как я написал низкоуровневый код потока для пулов ресурсов. –

3

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

Semaphore.Release(Int) 

Где Int является граф будет один способ сделать это.

+0

Не существует способа заставить его освободить потоки X, где X - это количество раз, когда 'waitHandle.Set()' вызывался? –

+0

Да. создайте его как «Авто». Что ты пытаешься сделать? Я уверен, что есть лучший способ, если вы сможете предоставить дополнительную информацию. Как упоминалось ниже, вы также можете использовать Семафор, но что-то пахнет рыбным. –

+0

Нет, событие автоматического сброса здесь не подходит. Вы полагаетесь на поток, который вызывает Set, чтобы вызвать его только один раз. Если событие получает значение дважды, прежде чем какой-либо поток будет удовлетворен ожиданием, тогда запускается только один ожидающий поток. –

1

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

У William Kempf есть article о том, почему переменные счетчика не работают, и решение, использующее класс .Net Monitor.

Смежные вопросы