帅气咕杂货间

浅谈信号量与互斥锁的区别和联系

Word count: 696 / Reading time: 2 min
2018/09/18 Share

区别

信号量与普通整型变量的区别

  1. 信号量是整型变量(是否非负取决于其实现方式),除初始化以外,只能通过两个标准原子操作 wait,signal来访问。

  2. 对信号量的操作被称为PV原语(不可中断、不可分割的程序),而普通整型变量可以在任何语句中被访问。

信号量与互斥锁间的区别

互斥:某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者的顺序,是无序的。

同步:是指在互斥的基础上(大多数情况),通过其他机制()实现访问者对资源的有序访问,大多数情况下,同步已经实现了互斥(比如对所有写入资源操作)。

根本区别:互斥量用于线程的互斥,信号量用于线程的同步,互斥不能保证访问者对资源的有序访问。

区别:互斥量的取值只能是0和1,信号量的取值为整数。同时,一个互斥量只能用于一个线程对一个资源的互斥访问,无法实现多资源的多线程访问互斥问题()。互斥量只能被一个线程加锁或解锁,但信号量可以被多个不同的线程等待或释放。

信号量可以解决多个同类资源的多个线程互斥同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。

  1. 信号量可被抽象为 等待(wait) 释放(post) 试图等待(tryWait) 创建(create) 销毁(destory) 而信号量则没有试图等待

  2. 互斥量是一个可以处在两态之一的变量:加锁和解锁,当一个线程想要访问临界区时,它调用mutex_lock。若当前为解锁的,则调用成功,该线程进入临界区,反之阻塞,若有多个阻塞,则在资源释放后随机分配到阻塞的线程中。

  3. PV原语 p(测试)阻塞 v(增加)释放

    P动作:1.sem减一 2.若sem减一后仍大于等于0,则进程继续执行 3.若sem减一后小于0 该进程被阻塞后进入等待队列。

    v动作:1.sem加一 2.若sem加一后结果大于0,进程继续进行 3.若结果小于或者等于0,则从该信号的等待队列中唤醒一个等待进程,然后返回原进程继续执行或转进程调度。

    PV对每个进程都只进行一次,且必须成对使用,PV执行中不允许有中断的发生。

CATALOG
  1. 1. 区别
    1. 1.1. 信号量与普通整型变量的区别
    2. 1.2. 信号量与互斥锁间的区别
  2. 2.