Будет ли ManualResetEvent использовать процессор, пока он находится в состоянии ожидания?

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

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

2 ответа

Решение

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

Вы обычно хотите использовать поток пула вместо этого.

И посмотрите, что доступно в.NET 4.0. Как и ManualResetEventSlim (не основанный на объекте ОС) и класс Task.

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

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

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

Другие вопросы по тегам