multithreading - 一般与信号量会合

标签 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,信号不仅会打开进程,即使值为 -100,它也会从信号量的队列中删除 1 个进程。因此,您的第一个进程到达,它向障碍发出信号以转到 -n+2,然后等待将其放回 -n-1。下一个来并发出信号,它释放第一个,然后使其再次发出信号。基本上,您的代码只会停止前 n 个进程到达,直到下一个进程以 2 个为一组到达,而不是直到所有 n 个进程到达。

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

关于multithreading - 一般与信号量会合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023282/

相关文章:

c++ - 使用互斥锁和信号量实现屏障

Java 线程 : Should all shared variables be Volatile ?

c - POSIX 信号量父信号量值不受影响

objective-c - 顶点数组对象 (VAO) 能否在 OpenGL ES 中的 EAGLContext 之间共享?

等待条件下的C++线程死锁

iphone - 如何在 Iphone native 应用程序中同步 Google 日历、雅虎日历和 Toodledo?

testing - 在涉及全局变量的不同包中同步测试的最佳方法是什么?

javascript - Node.js 中的异步函数

multithreading - Spring-integration/ActiveMQ 在单个线程中订阅多个目的地

c# - 线程基础