Будет ли ManualResetEvent использовать процессор, пока он находится в состоянии ожидания? - PullRequest
4 голосов
/ 18 февраля 2012

В частности, относится ли снижение производительности переключения контекста к потокам, которые находятся в состоянии ожидания?

При каких условиях или обстоятельствах ManualResetEvent или WaitHandle могут потреблять ресурсы?

Ответы [ 2 ]

5 голосов
/ 18 февраля 2012

ManualResetEvent не имеет состояния ожидания.Единственное, что может ждать в MRE - это thread .И да, поток потребляет много драгоценных ресурсов без необходимости, когда он не выполняет то, для чего он был создан, выполняет код.Мегабайт виртуальной памяти и несколько объектов ядра.Единственный объект ядра, который использует MRE, - это маленький картофель по сравнению с этим.

Обычно вместо этого вы хотите использовать поток пула потоков.Как и ManualResetEventSlim (не основанный на объекте ОС) и класс Task.

2 голосов
/ 18 февраля 2012

В случае ManualResetEvent, нет. На самом деле поток не зацикливается или что-то еще. Он просто получил ссылку на себя, вставленную в список уведомлений ManualResetEvent. Когда ДРУГОЙ поток вызывает .Set для ManualResetEvent, этот другой поток заканчивает тем, что помещает ожидающий поток обратно в активную очередь.

Потребляемые ресурсы - это просто учет существования потока: стека, независимо от того, какие ресурсы ядра записаны, сохраненные регистры и т. Д. Теперь, если поток, о котором вы говорили, не использовал ManualResetEvent, а вместо какой-то цикл ожидания, тогда обязательно.

Теперь WaitHandle не является реализацией. Это просто абстрактный API. Нельзя сказать, как могут работать другие реализации WaitHandle.

...