信号量与互斥锁

这是多线程并发两个非常重要的概念,二者有很亲密的关系,但又不相同。

1.概念:

   临界区:临界区是指并发进程中与共享变量有关的程序段 ——关键程序段

   信号量s是非负整数的全局变量,表示可用资源数量(我们可以引申,当它的值小于0时,其绝对值表示等待使用该资源的进程个数)

   值得注意的是,信号量的值能且只能由两种特殊的操作即P(P操作原语)和V(V操作原语)来处理:

   P(s):如果s是非零的,那么P将s 减1(表示可用资源的数量减少),并且立即返回(返回到哪里?重复对s操作,判断s是否非零,是则挂起线程,不是则减1)。如果s为零,那么就挂起这个线程,直到s变为非零,而一个V操作会重启这个线程。在重启之后,P操作将s减1,并将控制返回给调用者。

   P(S):
            ①将信号量S的值减1,即S=S-1;

            ②如果S>=0,则该进程继续执行;否则该进程置为等待状态

  

    V(s):V操作将s加1(释放资源)。如果s为零,那么V就有重启任意且唯一一个的线程的功能,然后该线程将s减1,完成它的P操作。

    V(S):
            ①将信号量S的值加1,即S=S+1;

            ②该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。


   信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。      ——百度百科

   二元信号量:信号量提供了一种很方便的方法来确保对共享变量的互斥访问,即将每个共享变量与一个信号量s(初始为1)联系起来,然后P(s)和V(S)操作将相应的临界区包围起来。以这种方式来保护共享变量的信号量就是二元信号量(因为它的值只为0和1,即对于一个资源(这里一般是一个关键段(代码,有共享变量,不可冲突使用))来说,只有可用不可用两种情况,0为忙。1为空闲可用).

   互斥锁:以提供互斥为目的的二元信号量。

   加锁:在一个互斥锁上执行P操作。

   解锁:在一个互斥锁上执行V操作。

    两个线程不能同时对同一个互斥对象加锁。

   互斥对象是这样工作的:如果线程 a 试图锁定一个互斥对象,而此时线程 b 已锁定了同一个互斥对象时,线程 a 就将进入睡眠状态。一旦线程 b 释放了互斥对象(通过 V(&mutex) 调用),线程 a 就能够锁定这个互斥对象(换句话说,线程 a 就将从 P(&mutex) 函数调用中返回,同时互斥对象被锁定)。同样地,当线程 a 正锁定互斥对象时,如果线程 c 试图锁定互斥对象的话,线程 c 也将临时进入睡眠状态。对已锁定的互斥对象上调用P(&mutex) 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。通常使用P(&mutex) 和 V(&mutex) 来保护数据结构。这就是说,通过线程的锁定和解锁,对于某一数据结构,确保某一时刻只能有一个线程能够访问它。可以推测到,当线程试图锁定一个未加锁的互斥对象时,POSIX 线程库将同意锁定,而不会使线程进入睡眠状态。


   信号量不变性:P和V的定义确保了一个正在运行的程序绝不可能进入一个s变为负值的状态。

   

    线程同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。在多线程编程里面,一些敏感数据(共享变量——临界资源)不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。线程必须先获得互斥锁才能访问临界资源,访问完临界资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。

    总而言之:同步是针对步调即线程的执行过程而言的,而互斥则是针对数据的保护而言的(只能是二元信号量),二者是一个问题的两个方面。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值