线程的同步和互斥

1.基本概念

同步:指定线程的执行顺序,比如有两个线程A,B都要访问资源的时候,B执行了途中需要A的结果,所以B先让出资源,等A执行结束后再执行B

互斥:多个线程访问系统资源的时候,同时只能有一个线程对资源进行访问

2.线程间的同步和互斥是通过操作系统中信号量和PV原语来实现的

PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

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

           ②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

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

           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

3.举个栗子(经典的生产者和消费者模式)

条件1:生产者在生产前需要看实体店是否缺货(定义为判断是否为空的同步信号量),如果缺货则开始生产,而消费者判断是否有货(判断是否为满的同步信号量),有货才可以购买。(引入同步信号量)

条件2:因为实体店有限,多个生产者在生产产品时候需要指明往哪个实体店放,这样其他生产者此时就不能再生产往该实体店放的产品了,否则两个生产者同时生产一个实体店需要的产品,都生产完只能放一个生产者的产品,另一个生产者的产品就没地方放了。(引入互斥信号量)

下面看操作:

1).定义两个同步信号和一个互斥信号量

empty=1(判断是否为空的同步信号量)

full=0(判断是否为满的同步信号量)

mutex=1(互斥信号量一般定义为1)

2).生产者操作

while(true)

{

P(empty)//查看是否能生产,判断是否为空

p(mutex)//锁定实体店,别的生产商不可向该实体店生产产品

临界区(定义了对临界资源的访问代码,这里临界资源指实体店)

V(mutex)//解除锁定实体店

V(full)//通知消费者可以购买,表示实体店满(full+1为真)

}

3).消费者操作

while(true)

{

P(full)//查看是否能购买,判断是否为满

p(mutex)//锁定实体店,别的消费商不可向该实体店购买产品

临界区(定义了对临界资源的访问代码,这里临界资源指实体店)

V(mutex)//解除锁定实体店

V(empty)//通知生产者可以生产,实体店为空(empty+1为真)

}

4.例题

有三个进程PA、PB、PC协作解决文件打印问题:PA每次将一条文件记录从磁盘读入输入缓冲区,PB将输入缓冲区的内容复制到输出缓冲区中,PC则将输出缓冲区中的内容打印出来,PC每执行一次,打印一条文件记录。输入缓冲区的容量与输出缓冲区完全相同,请用信号量机制保证文件的正确打印

思路:

[1] PA和PB因共享输入缓冲区Cache-I而相互制约,所以设置互斥信号量CI;同理,设置互斥信号量CO
控制进程PB和PC对输出缓冲区Cache-O的访问。 

[2] 因三个进程的直接制约关系而设置的同步信号量如下: 
ab:PA的执行依赖PB释放缓冲区为空的信息; ba:PB的执行要检测PA的数据是否放入缓冲区; 
bc:PB的执行要检测有PC释放的输出缓冲区为空的信息; cb:PC执行需要检测PB的数据是否放入缓冲区。

[3]一个缓冲区定义2同1互(信号量)

答案:

P(ab)   P(CI)   放入缓冲区Cache-I   V(CI)   V(ba)

P(ba)   P(CI)   取缓冲区Cache-I的数据   V(CI)   V(ab) 

P(bc)   P(co)   放入缓冲区Cache-O   V(co)   V(cb)

P(cb)   P(co)   取缓冲区Cache-O的数据   V(co)   V(bc)

原文地址:https://www.cnblogs.com/runninglzw/p/4428935.html