三个信号量如何在三个线程的同步执行中工作?

时间:2014-01-08 18:21:29

标签: multithreading process thread-safety semaphore mutual-exclusion

  

在某个系统中,使用三个信号量S1,S2和S3同步三个线程的执行,如下所示。信号量S1和S2初始化为零,而信号量S3初始化为1.所有三个信号量仅用于下面显示的代码部分。

Thread A   Thread B  Thread C
...        ...       ...
P(S1)      P(S2)     P(S3)
P(S1)      P(S1)     V(S1)
x=3*x+4    x=x+7     x=x*5
V(S2)      V(S2)     V(S1)
V(S1)      V(S1)     V(S3)

...... ......

  

如果变量x被定义为整数共享变量,则初始化为1,   除了之外,代码的任何其他部分都没有赋值   如上所示,当所有线程都具有它的价值时   完成执行?三个信号量中的值是多少?

我正在尝试解决过去的这篇论文,以便为我的操作系统考试做准备。我不知道如何修改变量x以及三个信号量如何协同工作。如果有人能够一步一步地告诉我信号量如何一起工作以及如何修改变量,我将不胜感激。

如果你有任何其他类似的例子可以练习,请不要犹豫,将它链接起来。

1 个答案:

答案 0 :(得分:1)

让我们来完成这个过程。

请在开始前阅读Wikipedia Article: Semaphore programming: Semantics and implementation部分。它将解释P()和V()运算符的作用。

初始:S1 = 0,S2 = 0,S3 = 1

  1. 线程A递减S1,线程B递减S2。 S1 = -1,S2 = -1。因为这些值都是负数,所以这两个线程都会阻塞。

    状态:S1 = -1,S2 = -1,S3 = 0,S1上的线程A阻塞(指令1),S2上的线程B阻塞(指令1),线程C未阻塞(指令1) ,x = 1

  2. 线程C递减S3,现在为0.因为这不是负数,所以此线程不会阻塞。线程C现在增加S1。线程1在S1上阻塞,立即解除阻塞并重新递减S1,导致它再次阻塞。

    状态:S1 = -1,S2 = -1,S3 = 0,S1上的线程A阻塞(指令2),S2上的线程B阻塞(指令1),线程C未阻塞(指令3) ,x = 1

  3. 线程C执行x=x*5,将x从1更改为5.线程C然后递增S1。在S1上阻塞的线程1立即解除阻塞。然后,线程C再次递增S3并结束。

    状态:S1 = 0,S2 = -1,S3 = 1,线程A未阻塞(指令3),线程B阻塞S2(指令1),线程C完成,x = 5

  4. 线程A执行x=3*x+4,将x从5更改为19.线程A然后递增S2。线程B,在S2上阻塞,立即解除阻塞。线程A然后再次递增S1并结束。

    状态:S1 = 1,S2 = 0,S3 = 1,线程A完成,线程B未阻塞(指令2),线程C完成,x = 19

  5. 线程B减少S1,现在为零。因为这不是负面的,它会继续并执行x=x+7,它将x从19更改为26.线程B然后递增S2,然后递增S1并结束。

    最终状态:S1 = 1,S2 = 1,S3 = 1

  6. 现在让我们通过计算每个信号量的P()和V()调用来重复检查我们的结果,并确保我们没有错过任何内容。由于没有循环,我们可以轻松地执行此操作,因为所有三个线程中的每条指令都只执行一次。

    • S1的初始值为0.三个P(S1)调用将其减少为-3。四个V(S1)调用增加到1.我们的结果显示最终S1 = 1. 检查
    • S2的初始值为0.一个P(S2)调用将该值减少为-1。两个V(S2)调用增加到1.我们的结果显示最终S2 = 1. 检查
    • S3的初始值为1.一个P(S3)调用将该值递减为0.一个V(S3)调用将其递增为1.我们的结果显示最终的S3 = 1. CHECK

    祝你考试好运!