Windows 监视器和其他同步原语之间有什么区别

Windows 监视器和其他同步原语之间有什么区别,windows,multithreading,winapi,mutex,critical-section,Windows,Multithreading,Winapi,Mutex,Critical Section,监视器与其他同步原语(如互斥体、WinAPI事件和关键部分)之间的实际区别是什么?在我看来,这完全是一样的——一次一个线程可以锁定监视器,而其他线程应该等待它释放,就像在事件和关键部分的情况下一样 那么,有什么区别呢?我错在哪里?Windows下的所有这些同步原语都有类似的操作(等待和信号),但这些操作的行为略有不同。所以原语的用法通常是不同的 临界段有所有者线程,因此只能由所有者释放(信号ed) 此外,与其他原语不同,关键部分的操作使用指针而不是句柄,因此WaitForMultipleObje

监视器与其他同步原语(如互斥体、WinAPI事件和关键部分)之间的实际区别是什么?在我看来,这完全是一样的——一次一个线程可以锁定监视器,而其他线程应该等待它释放,就像在事件和关键部分的情况下一样


那么,有什么区别呢?我错在哪里?

Windows下的所有这些同步原语都有类似的操作(
等待
信号
),但这些操作的行为略有不同。所以原语的用法通常是不同的

  • 临界段有所有者线程,因此只能由所有者释放(
    信号
    ed)
  • 此外,与其他原语不同,关键部分的操作使用指针而不是句柄,因此
    WaitForMultipleObjects
    和类似函数不能使用关键部分

  • 互斥体与关键部分非常相似,但它们由句柄标识,因此可以与其他对象一起等待(使用
    WaitForMultipleObjects
  • 函数也可用于互斥体

  • 事件支持手动重置模式,当成功等待事件未重置时。因此,几个服务员可以在同一时间绕过等待单个事件

  • 信号量(用于监视器的WinAPI变体)允许使用超过1的限制,即信号量保护的代码段不再是独占的,如关键段和互斥


  • 此外,信号量没有所有者语义,因此它们可以由任何线程发出信号。此功能对某些算法至关重要。

    你所说的“监视器”是什么意思?@Jonathan Potter它是瑞士军刀式同步原语。它简单地取代了互斥,但为(比如)难以用变体或信号量实现的有界生产者/消费者添加了优雅的解决方案。winapi不提供监视器,您必须使用条件变量或并发运行时。请阅读MSDN文档:。它解释了各种原语是什么以及如何使用它们。