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

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

监视器是一个旨在从多个线程访问的对象。 监视器对象的成员函数或方法将强制互斥,所以在给定时间只有一个线程可能正在对该对象执行任何操作。 如果一个线程正在执行对象的成员函数,那么任何其他尝试调用该对象的成员函数的线程将不得不等待,直到第一个线程完成。

信号量是一个较低级别的对象。 您可能会使用信号量来实现监视器。 信号量本质上只是一个计数器。 当计数器是肯定的,如果一个线程试图获得信号量,那么它是允许的,并且计数器递减。 当一个线程完成后,它释放信号量,并增加计数器。

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

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

信号量就像一个自行车出租的地方。 他们有一定数量的自行车。 如果你尝试和雇用一辆自行车,他们有一个自由,那么你可以把它,否则你必须等待。 当有人退回自行车的时候,别人可以把它拿走。 如果你有一辆自行车,那么你可以把它交给其他人返回—只要他们把自行车拿回来,自行车出租的地方并不关心谁返还。

下面的解释实际解释了监视器的wait()和signal()与信号量的P和V有什么不同。

监视器中的条件variables的wait()signal()操作与计数信号量时的 PV操作类似。

等待语句可以阻止进程的执行,而信号语句可以导致另一个进程被解除阻塞。 但是,它们之间有一些区别 。 当进程执行P操作时,由于计数信号可能大于零,所以不一定会阻止该进程。 相反,当一个等待语句被执行时,它总是阻塞这个进程。 当一个任务在一个信号量上执行一个V操作时,如果没有解锁任务的话,它可以放开一个等待该信号量的任务,或者增加信号量计数器。 另一方面,如果一个进程在没有其他进程被解除阻塞的情况下执行一个信号语句,那么对条件variables没有影响。 信号量和监视器之间的另一个区别是,V操作唤醒的用户可以立即恢复执行。 相反,只有当显示器解锁时,才会重新启动由信号操作唤醒的用户。 另外,监视器解决scheme比带信号量的解决scheme更具结构性,因为数据和过程被封装在一个单一的模块中,互斥被实现自动提供。

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

信号量允许多个线程(最多一个集合号)访问共享对象。 监视器允许共享对象的互斥访问。

监控

信号

一线答案:

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

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

监视器是一组多重例程,受互斥锁保护,而信号量比监视器更简单,因为它只是一个保护共享资源的锁,而不是像监视器这样的一组例程。 应用程序必须在使用由信号量保护的共享资源之前获取locking。

监视器和信号都用于同一目的 – 线程同步。 但是,监视器比信号量更易于使用,因为它们处理锁获取和释放的所有细节。

使用信号量的另一个区别是访问共享资源的每个例程在使用资源之前都必须显式获取一个锁。 在编写处理multithreading的例程时,这很容易被遗忘。 与信号灯不同,监视器会自动获取必要的locking。

信号量:

使用计数器或标志来控制访问并发系统中的某些共享资源,意味着使用信号量

例:

  1. 一个柜台只允许50名乘客获得任何剧院/公共汽车/火车/娱乐车/教室的50个座位(共享资源)。 只有当有人离开座位时才允许新的乘客。
  2. 指示任何浴室的空闲/占用状态的二进制标志。
  3. 交通灯是标志的好例子。 他们通过调节道路上车辆的通行来控制stream量(共享资源)

标志只显示资源的当前状态,没有计数或有关等待或运行资源上的任何其他信息。

显示器:

监视器通过与对象感兴趣的对象进行通信来同步对对象的访问,要求他们获取访问权限或等待某些条件成为真实。

例:

  1. 父亲可以作为她女儿的监视器,允许她每次只能跟一个男人约会。
  2. 一位学校老师用接力棒只让一个孩子在课堂上讲话。
  3. 最后一个是技术性的,一个Account对象上的交易(通过线程)同步保持完整性。

当使用信号量来保护关键区域时,信号量和被保护的数据之间没有直接的关系。 这是为什么信号量可能分散在代码周围的原因之一,为什么很容易忘记调用等待通知 ,在这种情况下,结果将分别违反互斥或永久locking资源。

相比之下,这些不好的事情可能会发生在显示器上。 监视器对数据直接感到厌倦(它封装了数据),而且由于监视器操作是primefaces操作,不可能编写可访问数据的代码,而无需调用入口协议。 监视器操作完成后,将自动调用退出协议。

监视器在进行之前有条件variablesforms的条件同步内置机制。 如果条件不满足,则该过程必须等待,直到通知条件改变。 当一个进程正在等待状态同步时,监视器实现将处理互斥问题,并允许另一个进程访问监视器。

取自开放大学M362单元3“互动过程”课程教材。