乐趣区

关于锁:互斥锁和信号量有什么不同译

原文地址

什么是信号量?

信号量是一个非负变量, 并且在线程之间共享。信号量是一种信号机制,一个线程正在期待信号量能够由另一个线程收回。它应用两个原子操作,1)wait和 2)signal实现线程同步。

信号量实现容许或不容许拜访资源,这取决于它的设置形式。

什么是互斥锁?

互斥的残缺模式是互斥对象。它是一种非凡类型的二进制信号,用于管制对共享资源的拜访。它蕴含了一个优先级继承机制来防止扩大优先级反转问题。它容许以后优先级较高的工作在尽可能短的工夫内放弃在阻塞状态。然而,优先级继承并不能解决优先级反转问题,只能最小化其影响。

次要区别:
互斥锁是一种锁机制,信号量是一种信号机制
互斥锁是一个对象,信号量是一个整数
互斥锁没有子类型,信号量有两种子类型,计数信号量和二进制信号量
信号量反对 wait 和 signal 操作批改,而互斥锁仅能由可能申请或开释资源的过程批改
信号量的值应用 wait()signal()这两个办法批改,而互斥锁应用 lock 和 unlock 来操作。

应用信号量

在单个缓冲区的状况下,咱们能够将 4KB 的缓冲区分成四个 1KB 的缓冲区。信号量能够与这四个缓冲区相关联。这容许用户和生产者同时在不同的缓冲区上工作。

应用互斥锁

互斥锁提供了互斥的性能,不论是生产者还是消费者,都能够持有锁,持有锁的一方能够持续工作,另一方就要期待,在同一时间,只有一个线程能够解决整个缓冲区。

对于互斥和信号量的常见事实

  • 只有一个工作能够获取到互斥锁,互斥锁有所有权,只有持有锁的工作能力开释互斥锁。
  • 应用互斥锁和信号量的场景是不同的,然而因为实现形式有相似之处,互斥锁也被称为二进制信号量
  • 一个家喻户晓的谬误:互斥量和信号量简直雷同,惟一的区别是互斥量可能计数到 1,而信号量可能从 0 计数到 N
  • 二进制信号量和互斥量之间总是存在不确定性。你可能据说互斥锁是一个二进制信号量,这是不正确的

信号量的长处

  • 容许多个线程拜访临界区
  • 信号量是独立于机器的(因为它们是在内核服务中实现的)
  • 不容许多个过程进入临界区。
  • 信号量有忙等状态,因为不会浪费时间和资源

互斥锁的长处

  • 互斥锁只是简略的锁,在进入临界区是持有它,来到时开释
  • 因为在任何给定工夫只有一个线程处于临界区内,因而不存在数据竞争,能够始终保持数据一致性

信号量的毛病

  • 信号量的最大限度之一是优先级反转问题
  • 操作系统必须跟踪所有信号量的调用
  • 为了防止信号量中的死锁,waitsignal 操作须要以正确的程序执行
  • 信号量编程是一种简单的办法,因而有可能无奈实现互斥的成果
  • 它也不是能够大规模应用的实用办法,因为它们的应用会毁坏模块化
  • 程序员应用信号量更容易出错,容易呈现死锁

互斥锁的毛病

  • 如果一个持有锁的线程休眠或者被强占了 CPU,其余线程就没方法继续执行了
  • 一次只能容许一个线程拜访临界区
  • 失常实现可能会导致忙期待状态,节约 CPU 工夫
退出移动版