Zep*_*hyr 27 multithreading operating-system mutex semaphore monitor
我读到互斥锁是一个值为1(二进制信号量)的信号量,用于强制互斥.
我读到了这个链接 Semaphore vs. Monitors - 有什么区别? 这表明监视器有助于实现互斥.
任何人都可以告诉我互斥和监视器之间的区别,因为两者实际上都在做同样的事情
Vik*_*ram 20
由于您没有指定您正在谈论的操作系统或语言/库,请让我以通用的方式回答.
从概念上讲,它们是相同的.但通常它们的实施方式略有不同
监控
通常,监视器的实现更快/更轻,因为它是为同一进程内的多线程同步而设计的.而且,通常,它由框架/库本身提供(与请求OS相反).
互斥
通常,互斥体由OS内核提供,库/框架只提供调用它的接口.这使得它们重量级/速度较慢,但它们可以跨不同进程的线程工作.操作系统还可能提供按名称访问互斥锁的功能,以便在单独的可执行文件的实例之间轻松共享(而不是使用fork仅可以使用的句柄).
小智 8
监视器与Mutex不同,但在监视器构建在Mutex之上的意义上,它们可以被认为是相似的.有关清晰度,请参见底部图像中的监视器描述.
Monitor是一种同步构造,它允许线程同时具有互斥(使用锁)和协作,即使线程等待某些条件为真的能力(使用wait-set).
换句话说,与实现锁定的数据一起,每个Java对象在逻辑上与实现等待的数据相关联.锁可以帮助线程独立地在共享数据上工作而不会相互干扰,而等待集帮助线程彼此协作以共同朝着共同的目标工作,例如,所有等待的线程将被移动到此等待集,并且所有线程将被通知一旦锁定被释放.这个等待集有助于构建监视器,并提供锁定(互斥)的额外帮助.
我想要你,你可以在这里看到我的答案,这可能与这个问题有关,也可能没有.
您可以在此处找到其他相关讨论
不幸的是,教科书的定义并不总是对应于不同平台和语言如何使用这些术语。因此,要获得准确的答案,您必须指定平台和上下文。但总的来说:
一个互斥体是只能由单个线程在同一时间内拥有的锁。锁本身并不保护任何东西,但代码可以检查互斥锁的所有权,以确保某段代码一次仅由一个线程执行。如果一个线程想要获取互斥锁,该线程将被阻塞,直到它变得可用。
在 Java 术语中,监视器是与对象隐式关联的互斥锁。当synchronized关键字应用于类或方法时,会在代码周围创建一个隐式互斥锁,以确保一次只有一个线程可以执行它。这称为监视器锁或只是监视器。
因此,在 Java 中,监视器不是特定对象,而是任何对象都有可用的监视器锁,该锁可用synchronized关键字调用。
的synchronized关键字也可以一个代码块上使用,在这种情况下,对象以锁定上是明确的指定。这里有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。
在计算机科学教科书中,您可能会遇到一种不同类型的监视器,Brinch-Hansen 或 Hoare-monitor,它们是隐式线程安全的类或模块(如 Java 中的同步类)并且具有多个线程可以等待的条件/ 信号开启。这是一个比 Java 监视器更高级的概念。
C#/.net 有类似于 Java 的监视器,但Mutex在标准库中有一个类——它不同于监视器中使用的互斥锁。监视器锁只存在于单个进程中,而Mutex-lock 是机器范围的。因此监视器锁适用于使对象和数据结构线程安全,但不适用于提供对文件或设备的系统范围的独占访问。
所以底线:这些术语可能意味着不同的东西,所以如果你想要一个更具体的答案,你应该指定一个特定的平台。