Monitor vs Mutex

时间:2016-07-02 11:32:58

标签: multithreading operating-system mutex semaphore monitor

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

我读了这个链接 Semaphore vs. Monitors - what's the difference? 这表明监视器有助于实现互斥。

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

3 个答案:

答案 0 :(得分:16)

由于您尚未指定所讨论的操作系统或语言/库,请让我以通用方式回答。

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

<强>监视器

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

<强>互斥

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

答案 1 :(得分:7)

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

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

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

enter image description here

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

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

Semaphore vs. Monitors - what's the difference?

答案 2 :(得分:1)

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

互斥锁是一个锁,一次只能由单个线程拥有。锁本身并不能保护任何东西,但是代码可以检查互斥量的所有权,以确保某些部分的代码一次只能由单个线程执行。如果某个线程想要获取互斥锁,则该线程将被阻塞直到可用。

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

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

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

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

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

最重要的是:这些术语可能意味着不同的含义,因此,如果您想要更具体的答案,则应指定一个特定的平台。

相关问题