【问题标题】:Mutex vs Event in WindowsWindows 中的互斥体与事件
【发布时间】:2011-10-18 07:32:26
【问题描述】:

如果我这样做,有人可以解释一下有什么区别

mutex = createMutex
waitForSingleObject
Release(mutex)

event = createEvent
waitForSingleObject
Release(event)

我很困惑,我可以使用两个版本进行同步吗?在此先感谢您的帮助

【问题讨论】:

    标签: windows winapi events mutex


    【解决方案1】:

    您使用互斥锁来确保只有一个执行线程可以访问某些内容。例如,如果你想更新一个可能被多个线程使用的列表,你会使用互斥锁:

    acquire mutex
    update list
    release mutex
    

    使用互斥锁,一次只能有一个线程执行“更新列表”。

    如果您希望多个线程在继续之前等待某事发生,您可以使用手动重置事件。例如,您启动了多个线程,但它们都暂停等待其他事件,然后才能继续。一旦该事件发生,所有线程都可以开始运行。

    主线程如下所示:

    create event, initial value false (not signaled)
    start threads
    do some other initialization
    signal event
    

    每个线程的代码是:

    do thread initialization
    wait for event to be signaled
    do thread processing
    

    【讨论】:

    • 什么是互斥锁的初始值:有信号还是没有信号?
    • @yeap:在几乎所有情况下,包括本例,您都希望创建互斥锁,以便最初不获取它。
    • 一个重要的区别是互斥锁可以被同一个线程重复锁定(它是“递归的”),而事件可以用来实现非递归锁定。
    • 如果 Event 在我没有等待的时候被触发了,但是一旦我准备好了它就不会被触发(例如 init ready 事件)
    • @Johnny_D:如果设置了手动重置事件,它会一直保持设置直到重置。因此,在您的情况下,事件已设置,另一个线程出现并看到它已设置,然后继续 - 无需等待。如果您对活动的运作方式还有其他疑问,请在此处发布问题而不是发表评论。
    【解决方案2】:

    是的,两者都可以用于同步,但方式不同。

    Mutex 是互斥对象,一次只能由一个实例获取。它用于避免多个计算机代码同时使用公共资源,例如全局变量

    Event 是一个可以通过使用 SetEvent 函数显式设置为状态的对象。

    【讨论】:

    • 你是什么意思?事件可以被多个实例获取吗?如果我执行waitForSingleObject,也可以发出互斥锁信号,我错了吗?
    • 是的,事实上任何同步对象都可以在 WaitForSingleObject/WaitForMultipleObject 中使用。不同之处在于他的行为。
    • 没有像获取互斥锁或获取临界区一样获取事件。事件发生时可以发出事件信号。
    • 多个实例呢?多个实例可以等待某个信号吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2013-06-08
    相关资源
    最近更新 更多