UNIX环境编程——信号量与互斥量对比

本期主题:
信号量与互斥量的对比

发现CSDN一篇文章的大小有限,所以新开了一篇讲这一部分,前面的内容在


往期地址:



信号量和互斥量的总结

1.信号量概念总结:

信号量就类似一个信号灯,是多线程环境下用来协调各个线程的,保证各个线程能够合理、正确的使用公共资源。
信号量通过计数器对共享资源控制,只有当计数器>0时,共享才允许被线程访问。
因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。

结合操作系统中的PV操作
P和V是来源于两个荷兰语词汇,P—— passeren,中文译为"通过";V—— vrijgeven,中文译为"释放"。
P就是去线程去申请通信证,P(S)即为:
(1)如果信号量S的值大于0,则该线程获得一个通信证;
(2)如果S的值为0,则进程进入等待队列,直到V操作唤醒;

2.信号量的操作可总结为:

Semaphore可以被抽象为五个操作:

  • 创建 Create

  • 等待 Wait:

线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。

  • 释放 Post

执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。

  • 试图等待 TryWait

如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。

  • 销毁 Destroy

3.互斥量概念总结

互斥量本质上就是一把锁,用来锁住资源,提供对资源的独占访问,具有排他性。
Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。

4.互斥量操作总结:

Mutex可以被抽象为四个操作:

  • 创建 Create

  • 加锁 Lock

  • 解锁 Unlock

  • 销毁 Destroy

5.信号量与互斥量的区别

1. 互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,这也是互斥和同步的差别。
互斥:某一资源在同一时刻只能有一个访问者去访问,具有唯一性和排他性,但是互斥无法保证访问者的顺序,所以互斥是无序的;
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

2. 互斥量值只能为0/1,信号量值可以为非负整数
一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值