与信号量进行流程同步

时间:2018-02-13 14:39:52

标签: concurrency

这是一个面试问题,任何帮助都将不胜感激

如何同步两个进程,其中一个进程增加一个值并显示它(P.S。显示该值的进程必须仅在其新值时显示一个值)

Ex:int x = 5; P1:将其增加到6 P2:必须显示6(仅一次),并且当它变为7时必须再次显示

我回答说我会使用类似

的信号量
int c=0; // variable that I used to synchronize


// In P1
if( c = 0 )
{
   c++;
   x++; // value that is incremented
}

// in P2
if( c == 1 )
{
   cout<<x;
   c--;
}

然后他询问如果在将c设置为1之后但在递增x之前从进程P1切换到P2时会怎么做(在这种情况下,它会在递增x之前进入P2)

我无法回答这一部分。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是python中的一个有效解决方案,需要2个信号量。 请注意,这是单个生产者/打印机的解决方案,如果您需要多个生产者/编写者,它将无法工作

   from threading import Semaphore, Thread

    x = 0
    ITERS = 10


    def producer():
        global x
        while x < ITERS:
            s_empty.acquire()
            x += 1
            s_full.release()


    def printer():
        while x < ITERS:
            s_full.acquire()
            print(x)
            s_empty.release()


    s_empty = Semaphore(1)
    s_full = Semaphore(0)

    t1 = Thread(target=producer)
    t2 = Thread(target=printer)

    t1.start()
    t2.start()