2015-11-23 7 views
1

Я один поток, ожидающий на EventWaitHandle (AutoResetEvent):Безопасно ли вызывать. Закрыть (.Dispose) на EventWaitHandle непосредственно после .Set?

AutoResetEvent.WaitOne(); 

У меня есть еще один поток сигнализации первый поток для продолжения

AutoResetEvent.Set(); 
AutoResetEvent.Close(); 

Безопасно ли звонить .close направлять после .set, другими словами, будет ли гарантировано, что ожидающая нить продолжается до того, как будет отключен AutoResetEvent?

+0

[docs for 'Close'] (https://msdn.microsoft.com/en-us/library/system.threading.waithandle.close (v = vs.110) .aspx) говорят: _" Как только этот метод вызывается, ссылки на текущий экземпляр вызывают неопределенное поведение ». _ Является ли это для новых ссылок на него или существующих, таких как ваш вызов' WaitOne', не уточняется. Но я не хотел бы попробовать ... почему бы не закрыть/избавить его от того, кто делает ожидания? –

+0

Потому что ожидание не является обязательным, поэтому он не будет удален, а если ожидание не будет выполнено ... – Edwin

ответ

1

Да, это безопасно, если все работает точно так, как описано в вашем вопросе. Если вы знаете, что все потоки уже ожидали, когда вы вызывали set, эти потоки будут сигнализированы, и все будет в порядке, так как все потоки, которые ждут, будут освобождены перед вызовом для установки возврата.

Однако, если вы по какой-либо причине испытаете гонку и набор вызовов и закроете до, поток начал ждать, вы получите исключение при попытке подождать. Поэтому на практике вам лучше избегать этого шаблона. IMHO

+0

Я думаю, вы никогда не узнаете, что потоки ждут. Они могли быть отложены 1 команда перед входом в ожидании, а другие потоки не могли сказать. – usr

+0

Спасибо за ваш ответ. Поэтому я отказываюсь от этой картины. Я нашел управляемую реализацию для AutoResetEvent, и я могу попробовать свою удачу в этом: http://www.codeproject.com/Articles/244638/Managed-Thread-Synchronization – Edwin

+0

@usr Именно поэтому я считаю, что это плохая модель, на которую можно положиться. Я не знаю достаточно о сценарии здесь, чтобы рекомендовать какое-то другое решение, но можно было бы реализовать некоторый простой потоковый обратный отсчет, когда контрольная сигнальная и контрольная команда потока проверяет счет перед закрытием дескриптора, чтобы убедиться, что все потребители выполнены с их задачей , Или просто обратные зависимости .. – Niclas