信号量算法的可能输出

Possible Outputs of Semaphore Algorithm

我正在努力研究信号量及其工作原理,但无济于事。我对一项作业有疑问

考虑下面显示的信号量算法。

semaphore S <- 1, T <- 0
p                       q
p1: wait (S)         q1: wait (T)
p2: write (“p”)      q2: write (“q”)
p3: signal (T)       q3: signal (S)

a.  What are the possible outputs for this algorithm?

有人能引导我找到解决这个问题的正确方向吗?

   sem_wait()  decrements (locks) the semaphore pointed to by sem.  If the semaphore's value
   is greater than zero, then the decrement proceeds, and the function returns, immediately.
   If  the  semaphore  currently  has  the  value zero, then the call blocks until either it
   becomes possible to perform the decrement (i.e., the semaphore value rises  above  zero),
   or a signal handler interrupts the call.

http://man7.org/linux/man-pages/man3/sem_wait.3.html

如果信号量包含大于 1 的值,则调用 wait 的进程可以继续而不会阻塞。当wait call returns semaphore value 减1 可以进入semaphore protected code block.process/threads的限制数。

代码中的初始状态只产生可能的输出 "pq" 因为线程 p 在第一次 wait 调用中没有阻塞地继续。线程 q 首先阻塞,直到线程 p 调用 signal(T)。调用 signal 会增加信号量。如果在信号调用时信号量的值为 0,并且有阻塞线程在等待它,线程之一 returns 到 运行 状态。

警告:在块的开始和结束时为不同的信号量调用等待和信号是个坏主意。很容易以导致竞争条件或死锁的复杂状态多线程状态转换结束。说完我不得不承认在单元测试中以非常相似的方式使用信号量来控制两个 ipc 进程的操作顺序。