二进制信号量和互斥量之间的区别

二进制信号量和互斥量之间是否有任何区别,或者它们基本相同?


#1楼

它们的同步语义非常不同:

  • 互斥锁允许序列化对给定资源的访问,即多个线程一次等待一个锁,并且如前所述,该线程拥有该锁直到完成: 只有这个特定的线程才能将其解锁。
  • 二进制信号量是一个值为0和1的计数器,一个任务在其上阻塞,直到任何任务执行sem_post为止。 信号量通告资源可用,并且它提供了一种机制,等待信号通知资源可用。

因此,可以将互斥锁看作是从一个任务传递到另一个任务的令牌,而将信号量看作是流量红灯( 表示有人可以继续进行操作)。


#2楼

http://www.geeksforgeeks.org/archives/9102详细讨论。

Mutex是一种锁定机制,用于同步对资源的访问。 Semaphore是信号机制。

如果他/她想使用二进制信号量代替互斥量,则取决于程序员。


#3楼

显然,您可以使用互斥锁将数据锁定在一个线程中,同时另一个线程可以访问该数据。 假设您刚刚调用了lock()并正在访问数据。 这意味着您不希望任何其他线程(或相同线程代码的另一个实例)访问由相同互斥锁锁定的相同数据。 也就是说,如果在不同的线程实例上执行的是相同的线程代码,则会命中该锁,那么lock()应该在那里阻塞控制流。 这适用于使用不同线程代码的线程,该线程代码也正在访问相同的数据,并且也被相同的互斥锁锁定。 在这种情况下,您仍处于访问数据的过程中,并且可能要花15秒钟才能达到互斥锁解锁(这样,在互斥锁中被阻塞的另一个线程将解除阻塞,并使控件能够访问数据)。 您是否不惜一切代价允许另一个线程仅解锁同一个互斥锁,然后又允许互斥锁中已在等待(阻塞)的线程取消阻塞并访问数据? 希望你明白我在这里说的话吗? 根据一致同意的通用定义!,

  • 使用“互斥体”不会发生这种情况。 没有其他线程可以解锁您的线程中的锁
  • 使用“二进制信号量”会发生这种情况。 任何其他线程都可以解锁您线程中的锁

因此,如果您非常在意使用二进制信号量而不是互斥量,那么在“确定”锁定和解锁范围时应格外小心。 我的意思是,碰到每个锁的每个控制流都应该打一个解锁调用,也不应有任何“首次解锁”,而应该始终是“首次锁定”。


#4楼

关于该主题的不错的文章:

从第2部分开始:

互斥锁与二进制信号量的原理相似,但有一个明显的区别:所有权原理。 所有权是一个简单的概念,当任务锁定(获取)互斥锁时,它只能解锁(释放)它。 如果任务试图解锁一个尚未锁定的互斥锁(因此不拥有),则会遇到错误情况,最重要的是,互斥锁不会解锁。 如果互斥对象不具有所有权,则与其所谓的无关,它不是互斥体。


#5楼

Mutex用于保护敏感代码和数据,信号量用于同步。您也可以与保护敏感代码一起实际使用,但是可能存在通过操作V释放其他线程的保护的风险。双信号量和互斥量之间的区别是所有权。例如,在洗手间,互斥量就像一个人可以进入马桶并锁上门,直到有人下车,其他人才能进入;双信号量就像一个人可以进入厕所并锁上门,但是其他人可以通过要求管理员打开门来进入,这很荒谬。


#6楼

互斥锁用于“锁定机制”。 一次一个进程可以使用共享资源

信号量用于“信号机制”,例如“我已经完成,现在可以继续”


#7楼

  • 根据定义, 互斥锁用于序列化对不能由多个线程同时执行的可重入代码段的访问。

  • 根据定义, 信号量将共享资源的同时用户数限制为最大数量

  • 信号量可以是互斥量,但互斥量永远不能是信号量。 这只是意味着二进制信号量可以用作互斥量,但是互斥量永远不能表现出信号量的功能。

  • 信号量和Mutex(至少是最新的内核)本质上都是非递归的。
  • 没有人拥有信号灯,而Mutex是拥有的,而所有者则对此负有责任。 从调试的角度来看,这是一个重要的区别。
  • 如果是Mutex,则拥有Mutex的线程负责释放它。 但是,在信号量的情况下,不需要此条件。 任何其他线程都可以通过使用smps(function.e_ot)发出信号以释放信号量

  • 对开发人员来说另一个重要的区别是,信号量是系统范围的,除非以其他方式进行清理,否则它们将以文件形式保留

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值