Является ли SetEvent атомным? - PullRequest
1 голос
/ 05 ноября 2008

Безопасно ли, чтобы 2 или более потоков вызывали SetEvent API Win32 для одного и того же обработчика событий, не защищенного критическим разделом?

Ответы [ 3 ]

1 голос
/ 26 мая 2009

Это безопасно, но помните, что если один поток устанавливает его, а другой поток устанавливает его одновременно, вы не получите два уведомления, только одно; так как 2-й изменил его с True на ... True. Если вас это беспокоит, используйте вместо этого Семафоры.

0 голосов
/ 26 мая 2009

нет ограничений на вызов SetEvent из нескольких потоков.

0 голосов
/ 05 ноября 2008

Предполагается, что у вас есть несколько потоков, ожидающих одного и того же события и выполняющих один и тот же код.

  1. Если ваш код не очищает событие до завершения его обработки, у вас фактически есть CS. Поскольку событие остается сигнальным до тех пор, пока оно не будет очищено (то есть, не сбрасывается автоматически), наличие нескольких потоков сигнализирует, что ничего не делает, кроме вращения ЦП.
  2. Если ваш код очищает его в начале обработки или событие автоматически установлено, то у вас будет несколько потоков, выполняющих одну и ту же функцию, что небезопасно, если эти потоки совместно используют что-либо.
...