使用信号量实现N进程屏障的修改

3

最近我遇到了一个问题,它与第一读者/写者问题非常相似。

使用信号量实现N进程屏障

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

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个回答

1
你的伪代码正确地将屏障返回到初始状态。不重要的建议:替换


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

以我的看法,更易读

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

然而,在使用屏障时可能会遇到一些坑。所述的屏障有两种状态:

  1. 停止每个线程,直到它们全部处于挂起状态。
  2. 恢复每个线程,直到它们全部处于运行状态。

没有保护措施来防止混淆这两种状态:有些线程正在被恢复,而其他线程已经再次进入第一个阶段。例如,您有一堆线程,它们执行一些操作,然后在屏障上同步。每个线程的主体将是:

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

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

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - 王智寬

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接