Multithreading SetEvent是原子的吗?

Multithreading SetEvent是原子的吗?,multithreading,winapi,events,atomic,critical-section,Multithreading,Winapi,Events,Atomic,Critical Section,让两个或多个线程在同一事件处理程序上调用Win32 API的SetEvent是否安全,而该事件处理程序不受关键部分的保护?假设有多个线程在同一事件上等待,运行相同的代码 如果您的代码在事件处理完成之前没有清除该事件,那么实际上您有一个CS。由于事件在清除之前一直保持信号状态(也称为not autoreset),因此具有多个线程的信号除了使CPU旋转外,什么也不做 如果您的代码在处理开始时将其清除,或者事件被自动设置,那么您将有多个线程运行同一个函数,如果这些线程共享任何内容,这是不安全的 从多个

让两个或多个线程在同一事件处理程序上调用Win32 API的SetEvent是否安全,而该事件处理程序不受关键部分的保护?

假设有多个线程在同一事件上等待,运行相同的代码

  • 如果您的代码在事件处理完成之前没有清除该事件,那么实际上您有一个CS。由于事件在清除之前一直保持信号状态(也称为not autoreset),因此具有多个线程的信号除了使CPU旋转外,什么也不做
  • 如果您的代码在处理开始时将其清除,或者事件被自动设置,那么您将有多个线程运行同一个函数,如果这些线程共享任何内容,这是不安全的

  • 从多个线程调用SetEvent没有任何限制。

    这是安全的,但请记住,如果一个线程设置了它,而另一个线程同时设置了它,则不会收到两个通知,只有一个;自从第二个改变它从真到…真。如果您对此感到担忧,请改用信号量。

    查看此链接,它可能会解决您的问题: