zoukankan      html  css  js  c++  java
  • 线程的同步和互斥

    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)

  • 相关阅读:
    StackView
    横竖屏
    Html
    UILabel
    NSString
    NSPredicate|谓词
    iphone
    函数
    UIBezierPath
    UICollectionView
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4428935.html
Copyright © 2011-2022 走看看