Monitor vs Mutex

Zep*_*hyr 27 multithreading operating-system mutex semaphore monitor

我读到互斥锁是一个值为1(二进制信号量)的信号量,用于强制互斥.

我读到了这个链接 Semaphore vs. Monitors - 有什么区别? 这表明监视器有助于实现互斥.

任何人都可以告诉我互斥和监视器之间的区别,因为两者实际上都在做同样的事情

Vik*_*ram 20

由于您没有指定您正在谈论的操作系统或语言/库,请让我以通用的方式回答.

从概念上讲,它们是相同的.但通常它们的实施方式略有不同

监控

通常,监视器的实现更快/更轻,因为它是为同一进程内的多线程同步而设计的.而且,通常,它由框架/库本身提供(与请求OS相反).

互斥

通常,互斥体由OS内核提供,库/框架只提供调用它的接口.这使得它们重量级/速度较慢,但​​它们可以跨不同进程的线程工作.操作系统还可能提供按名称访问互斥锁的功能,以便在单独的可执行文件的实例之间轻松共享(而不是使用fork仅可以使用的句柄).

  • 似乎相反(性能方面):http://japgolly.blogspot.bg/2012/04/ruby-mutex-reentrancy.html (2认同)

小智 8

监视器与Mutex不同,但在监视器构建在Mutex之上的意义上,它们可以被认为是相似的.有关清晰度,请参见底部图像中的监视器描述.

Monitor是一种同步构造,它允许线程同时具有互斥(使用锁)和协作,即使线程等待某些条件为真的能力(使用wait-set).

换句话说,与实现锁定的数据一起,每个Java对象在逻辑上与实现等待的数据相关联.锁可以帮助线程独立地在共享数据上工作而不会相互干扰,而等待集帮助线程彼此协作以共同朝着共同的目标工作,例如,所有等待的线程将被移动到此等待集,并且所有线程将被通知一旦锁定被释放.这个等待集有助于构建监视器,并提供锁定(互斥)的额外帮助.

在此输入图像描述

我想要你,你可以在这里看到我的答案,这可能与这个问题有关,也可能没有.

您可以在此处找到其他相关讨论

信号量与显示器 - 有什么区别?


Jac*_*esB 5

不幸的是,教科书的定义并不总是对应于不同平台和语言如何使用这些术语。因此,要获得准确的答案,您必须指定平台和上下文。但总的来说:

一个互斥体是只能由单个线程在同一时间内拥有的锁。锁本身并不保护任何东西,但代码可以检查互斥锁的所有权,以确保某段代码一次仅由一个线程执行。如果一个线程想要获取互斥锁,该线程将被阻塞,直到它变得可用。

在 Java 术语中,监视器是与对象隐式关联的互斥锁。当synchronized关键字应用于类或方法时,会在代码周围创建一个隐式互斥锁,以确保一次只有一个线程可以执行它。这称为监视器锁或只是监视器。

因此,在 Java 中,监视器不是特定对象,而是任何对象都有可用的监视器锁,该锁可用synchronized关键字调用。

synchronized关键字也可以一个代码块上使用,在这种情况下,对象以锁定上是明确的指定。这里有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。

在计算机科学教科书中,您可能会遇到一种不同类型的监视器,Brinch-Hansen 或 Hoare-monitor,它们是隐式线程安全的类或模块(如 Java 中的同步类)并且具有多个线程可以等待的条件/ 信号开启。这是一个比 Java 监视器更高级的概念。

C#/.net 有类似于 Java 的监视器,但Mutex在标准库中有一个类——它不同于监视器中使用的互斥锁。监视器锁只存在于单个进程中,而Mutex-lock 是机器范围的。因此监视器锁适用于使对象和数据结构线程安全,但不适用于提供对文件或设备的系统范围的独占访问。

所以底线:这些术语可能意味着不同的东西,所以如果你想要一个更具体的答案,你应该指定一个特定的平台。

  • AFAIK java 监视器也是互斥体 + 1 条件变量的组合。 (4认同)
  • AFAIK 监视器是互斥体和一个或多个条件变量的组合。 (2认同)