进程同步与进程互斥

来源:互联网 发布:网络联盟论坛 编辑:程序博客网 时间:2024/06/14 03:57

在多线程环境下,同步与互斥显得格外重要,如果处理不好,会导致运行结果出现意想不到的错误。


同步:先看下面这张图
这里写图片描述
线程p1,p2,p3合作完成一项任务,线程p2,p1可以并发进行,线程p3需要p1,p2都完成之后才能运行,这就是一个线程(或进程)同步问题。

临界资源:为多个线程所共享的资源,同一时间段只能容许一个线程对其进行操作的资源。
临界区:线程中,操作临界资源的程序段。
互斥:同一时间段内,只能容许一个线程进入临界区,对临界资源进行操作。


实现线程同步与线程互斥有软件方法和硬件方法,但是目前,软件方法很少使用,因此,这里我不涉及,主要讲解信号量机制(硬件方法)实现同步与互斥。

信号量S的含义:S>=0 代表当前可以使用的资源数量
S<0. 代表当前等待队列中线程数量

PV操作(不可被中断):

P(S):{      S=S-1;      if(S<0){      资源不足,将线程放入等待队列中       }  }V(S):{      S=S+1;      if(S>=0){      从等待队列中取出一个线程执行      }}

P(S)代表申请一个资源,如果S>0则表示目前有可用资源,线程可以继续执行,否则,将其放入等待队列中。

V(S)代表释放一个资源,如果等待队列不为空,则从里取出一个线程,让其执行。

给大家讲两个例题来帮助大家理解。
这里写图片描述
就针对这幅图,用信号量实现三个线程的同步。代码如下:

//定义信号量并附初值semaphore S1=0 S2=0p1:{     ...     p1代码段执行     V(S1)}p2:{     ...     p2代码段执行     V(S2)}p3:{     P(S1)     P(S2)     p3代码段执行     ...}

不知道大家都没有弄懂,不懂的话,欢迎评论,我会定期查看的,和大家交流。

例题二:生产者-消费者问题(很经典的线程同步问题)

问题描述:生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。这些资源可以是硬件资源,也可以是软件资源。

当某一进程使用某一资源时,可以看作是消费,称该进程为消费者。
而当某一进程释放某一资源时,它就相当于生产者。

通过一个有界缓冲区可以把一群生产者p1,p2…,pm,和一群消费者Q1,Q2,…,Qn联系起来。只要缓冲区未满,生产者就可以把产品送入缓冲区;只要缓冲区未空,消费者就可以从缓冲区中取走物品。如图:
这里写图片描述

解答代码如下:

//定义信号量semaphore mutex=1,S1=n,S2=0produce:{     P(S1)     P(mutex)     执行放入消息代码     V(mutex)     V(S2)}consumer:{     P(S2)     P(mutex)     执行取出消息代码     V(mutex)     V(S1)}

我来对上述变量进行解释一下,metux信号量是为了实现对共享缓冲区实现互斥,同一时间段内只能有一个线程对其进行修改。S1信号量表示空的缓冲区个数,S2表示非空缓冲区个数。

好吧,线程(或进程)的同步和互斥就讲到这里啦,其实就是要理解信号量机制就可以了。