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)

  • 相关阅读:
    vue自定义指令
    ZOJ Problem Set–2104 Let the Balloon Rise
    ZOJ Problem Set 3202 Secondprice Auction
    ZOJ Problem Set–1879 Jolly Jumpers
    ZOJ Problem Set–2405 Specialized FourDigit Numbers
    ZOJ Problem Set–1874 Primary Arithmetic
    ZOJ Problem Set–1970 All in All
    ZOJ Problem Set–1828 Fibonacci Numbers
    要怎么样调整状态呢
    ZOJ Problem Set–1951 Goldbach's Conjecture
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4428935.html
Copyright © 2011-2022 走看看