修改为"使用信号量实现N过程障碍"

时间:2017-01-18 04:44:00

标签: operating-system computer-science semaphore systems-programming barrier

最近我看到这个问题与第一个读写器问题很相似。

Implementing an N process barrier using semaphores

我正在尝试修改它以确保它可以重用并正常工作。

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


mutex.wait()
count = count + 1
if (count == n){ barrier.signal()}
mutex.signal()

barrier.wait()

mutex.wait()
count=count-1
barrier.signal()
if(count==0){ barrier.wait()}
mutex.signal()

这是对的吗?

我想知道是否存在一些我没有发现的错误。

1 个答案:

答案 0 :(得分:1)

您的伪代码正确地将屏障恢复到初始状态。不重要的建议:替换

barrier.signal()
if(count==0){ barrier.wait()}

恕我直言更可读

if(count!=0){ barrier.signal()} //if anyone left pending barrier, release it

然而,可能存在陷阱,重复使用障碍。描述的障碍有两种状态:

  1. 停止每个主题,直到所有主题都挂起。
  2. 恢复每个线程,直到所有线程都在运行
  3. 没有防止它们混合的保护:一些线程正在恢复,而其他线程已经再次进入第一阶段。例如,你有一堆线程,它们做一些事情,然后在屏障上同步。每个线程主体都是:

    while (!exit_condition) {
      do_some_stuff();
      pend_barrier(); // implementation from current question
    }
    

    程序员预计,do_some_stuff()的调用次数对于所有线程都是相同的。根据时间可能会发生(或不发生):在所有线程离开屏障之前,屏障释放的第一个线程完成do_some_stuff()计算,因此第二次重新进入挂起状态。因此,他将与当前屏障释放迭代中的其他线程一起被释放,并且将(至少)再次调用do_some_stuff()