Будет ли ManualResetEvent использовать процессор, пока он находится в состоянии ожидания?
Более конкретно, относится ли снижение производительности переключения контекста к потокам, которые находятся в состоянии ожидания?
При каких условиях или обстоятельствах ManualResetEvent или WaitHandle могут потреблять ресурсы?
2 ответа
ManualResetEvent не имеет состояния ожидания. Единственное, что может ждать в MRE - это поток. И да, поток потребляет много драгоценных ресурсов без необходимости, когда он не выполняет то, для чего он был создан, выполняет код. Мегабайт виртуальной памяти и несколько объектов ядра. Единственный объект ядра, который потребляет MRE - это маленький картофель по сравнению с этим.
Вы обычно хотите использовать поток пула вместо этого.
И посмотрите, что доступно в.NET 4.0. Как и ManualResetEventSlim (не основанный на объекте ОС) и класс Task.
В случае ManualResetEvent, нет. На самом деле поток не зацикливается или что-то еще. Он просто получил ссылку на себя, вставленную в список уведомлений ManualResetEvent. Когда ДРУГОЙ поток вызывает.Set для ManualResetEvent, этот другой поток заканчивает тем, что помещает ожидающий поток обратно в активную очередь.
Потребляемые ресурсы - это просто учет существования потока: стека, независимо от того, какие ресурсы ядра записаны, сохраненные регистры и т. Д. Теперь, если поток, о котором вы говорили, не использовал ManualResetEvent, а вместо этого цикл ожидания какой-то, то конечно.
Теперь WaitHandle не является реализацией. Это просто абстрактный API. Невозможно сказать, как могут работать другие реализации WaitHandle.