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

use*_*860 223 multithreading semaphore monitor

MonitorSemaphore之间的主要区别是什么?

Ant*_*ams 508

监视器是设计成从多个线程访问的对象.监视器对象的成员函数或方法将强制执行互斥,因此在给定时间只有一个线程可以对该对象执行任何操作.如果一个线程当前正在执行该对象的成员函数,则尝试调用该对象的成员函数的任何其他线程将必须等到第一个完成后才能执行.

信号量是一种较低级的对象.您可能会使用信号量来实现监视器.信号量本质上只是一个计数器.当计数器为正时,如果线程试图获取信号量,则允许它,并且计数器递减.线程完成后,它会释放信号量,并递增计数器.

如果线程试图获取信号量时计数器已经为零,那么它必须等到另一个线程释放信号量.如果一个线程释放信号量时多个线程正在等待,那么其中一个线程就会获得它.释放信号量的线程不必是获取信号量的线程.

监视器就像一个公共厕所.一次只能有一个人进入.他们锁门以防止其他人进来,做他们的东西,然后在他们离开时解锁.

信号量就像一个自行车出租的地方.他们有一定数量的自行车.如果您尝试雇用一辆自行车并且他们有一辆免费,那么您可以接受它,否则您必须等待.当有人返回自行车时,其他人可以接受它.如果你有自行车,那么你可以把它交给其他人返回---自行车租赁地点并不关心谁归还它,只要他们骑自行车回来.

  • +1与公共浴室和自行车出租地点相似.我永远不会忘记两者之间的区别. (154认同)
  • @Pacerier:我:-)唯一的矛盾是高级/低级别的东西.你**可以**从信号量构建一个监视器,它只是不是很整洁,正是**因为**监视器是一个比信号量更高级别的结构.信号量只是一个等待的计数器.我建议阅读"信号量小书"http://greenteapress.com/semaphores/ (5认同)
  • 是的,您可以从监视器构建信号量.您始终可以从高级对象构建低级对象.高/低级别的东西是关于功能和操作范围,而不是关于哪些可用于构建另一个. (5认同)
  • 您的答案似乎与http://stackoverflow.com/a/7336799/632951相矛盾.那么谁是对的? (4认同)
  • @AnthonyWilliams:我或许怀疑你只能从信号量构建监视器的想法.另一种方式也是可能的,因此我们不能大量说监视器是一个比信号量更高级别的实体. (3认同)

Abu*_*mon 9

下面的解释实际上解释了监视器的wait()和signal()与信号量的P和V的区别.

监视器中条件变量的wait()signal()操作类似于计数信号量时的PV操作.

wait语句可以阻止进程的执行,而signal语句可以导致另一个进程被解除阻塞.但是,它们之间存在一些差异.当进程执行P操作时,它不一定阻止该进程,因为计数信号量可能大于零.相反,当执行wait语句时,它总是阻塞进程.当任务对信号量执行V操作时,如果没有要解锁的任务,它将解除对等待该信号量的任务的阻塞或增加信号量计数器.另一方面,如果进程在没有其他进程解除阻塞时执行信号语句,则对条件变量没有影响.信号量和监视器之间的另一个区别是,通过V操作唤醒的用户可以无延迟地恢复执行.相反,仅在监视器解锁时才重新启动通过信号操作唤醒的用户.此外,监视器解决方案比具有信号量的解决方案更结构化,因为数据和过程封装在单个模块中,并且实现自动提供互斥.

链接:这里有进一步阅读.希望能帮助到你.


Bil*_*llz 6

一线答案:

监视器:一次 只能控制一个线程可以在监视器中执行.(需要获取锁来执行单个线程)

信号量: 一种保护共享资源的锁.(需要获取锁来访问资源)


taf*_*o85 5

信号量允许多个线程(最多一组号码)访问共享对象.监视器允许对共享对象进行互斥访问.

监控

信号

  • 但是,那么Monitor如何与MutEx不同?互斥锁与信号量完全相同,但只允许一个线程一次访问临界区. (10认同)
  • 是的,mnitor和互斥锁之间有什么区别? (2认同)
  • 值得注意的是,信号量并不控制对共享对象的访问,而是控制共享资源(将包含多个对象)的访问。 (2认同)

Jac*_*esB 5

信号量是一种用于在线程之间进行协调的信号机制。示例:一个线程正在从互联网下载文件,另一个线程正在分析文件。这是一个经典的生产者/消费者场景。signal()下载文件时,生产者会调用信号量。消费者调用wait()相同的信号量以便被阻塞,直到信号指示文件已准备好为止。如果当消费者调用 wait 时信号量已经发出信号,则该调用不会阻塞。多个线程可以等待一个信号量,但每个信号只能解除对一个线程的阻塞。

计数信号量跟踪信号的数量。例如,如果生产者连续发出三次信号,则wait()可以被调用三次而不会阻塞。二进制信号量不计数,仅具有“等待”和“发出信号”状态。

互斥锁(互斥锁)是由单个线程拥有的锁。只有获得锁的线程才能再次释放锁。尝试获取锁的其他线程将被阻塞,直到当前所有者线程释放它。互斥锁本身并不锁定任何东西——它实际上只是一个标志。但代码可以检查互斥锁的所有权,以确保一次只有一个线程可以访问某个对象或资源。

监视器是一种更高级别的构造,它使用底层互斥锁来确保对某些对象的线程安全访问不幸的是,根据上下文、平台和上下文,“监视器”一词有几种不同的含义,但例如在 Java 中,监视器是一个互斥锁,它与对象隐式关联,并且可以使用关键字调用synchronized。该synchronized关键字可以应用于类、方法或块,并确保一次只有一个线程可以执行代码。