一般与信号量交会

时间:2016-03-15 22:15:41

标签: multithreading synchronization semaphore

我正在通过The Little Book of Semaphores来实现集合的障碍。以下代码是否可以作为障碍?

如果我们有以下变量:

n = the number of threads
barrier = Semaphore(-n + 1)

我们在以下代码上执行n个线程。

# Rendezvous
barrier.signal()
barrier.wait()
barrier.signal()

# critical point

书评

这是作者的变量。

n = the number of threads
count = 0
mutex = Semaphore(1)
barrier = Semaphore(0)

作者的障碍解决方案

mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal()

barrier.wait()
barrier.signal()

# critical point

我理解作者的解决方案,我想知道我的方法是否有效。

1 个答案:

答案 0 :(得分:1)

你的解决方案的问题是,如果值变为1,信号不会打开过程,即使值为-100,它也会从信号量队列中删除1个进程。所以你的第一个进程到了,它发出障碍信号去-n + 2,然后等待把它放回-n-1。下一个发出信号,发出第一个信号,然后再发信号。基本上,你的代码只会停止前n个进程到达,直到下一个进程以2个为一组到达,直到所有n到达为止。

此外,只要您重置计数,正确的答案就允许重复,而如果第2轮的相同进程回来则会失败。