我搜索了MSDN,互斥锁可能被锁了两次,但是递归在同一线程中两次获取同一事件对象没有任何用语。

我们可以在同一线程中两次锁定win32事件吗?

编辑:锁定事件是什么意思?在这里,我假设事件是自动重置的。

  • Lock:从WaitForXXX(例如WaitForSingleObject)唤醒线程
  • 解锁:线程正在调用SetEvent或PluseEvent。
  • 最佳答案

    互斥锁与事件根本不同。互斥锁用于提供互斥,因此一次只能有一个线程可以访问资源,而事件只是一种通知机制。自动重置事件提供单次唤醒通知,而手动重置事件提供多次唤醒通知。

    如果发出自动重置事件信号,则只有一个线程将接收该信号,而该线程仅接收一次;任何其他线程-或从同一线程对该事件的等待函数的任何其他调用-将等待,直到第二次调用SetEvent为止。

    如果您发信号通知手动重置事件,那么它将一直保持发信号直到您将其重置,这样才能唤醒多个线程,并且从同一线程对该事件的等待函数的多次调用将成功,直到某些线程调用ResetEvent为止。

    一个事件都没有“所有者”:仅是因为线程A上次被设置该事件的另一个线程从其对等待函数的调用中唤醒,没有什么可以阻止它再次等待,也没有任何东西可以指定线程是否再次等待如果A或B等待相同的自动重置事件,它们将被唤醒。也没有什么要求任何特定的线程来调用SetEvent的:系统中的任何线程都可以这样做,无论该线程是否曾经为该事件调用wait函数。确实,一种常见的用例有一个调用SetEvent的线程,以及一个或多个其他线程在等待。

    因此:是的,您可以从刚刚等待该事件的线程中等待一个事件,但这不是锁,其他线程也可以等待该事件,并且如果该事件被发出信号,也可能会唤醒。

    已编辑问题的更新:

    您可以使用事件提供锁,但这不是固有语义的一部分。您可以使用相同的自动重置事件句柄连续两次调用WaitForSingleObject。就Windows而言,这并不是一个错误:您只需要确保其他一个或多个线程两次调用SetEvent,以使等待线程从第一次调用WaitForSingleObject唤醒,然后再进行第二次SetEvent调用,为了避免“丢失”的唤醒:SetEvent不计算调用次数,它只是设置标志。

    另外:不要使用PulseEvent。即使当前正在等待一个线程,它也不保证线程将唤醒。

    09-10 23:48