c++ - 使用 System V 信号量创建聚集/屏障函数

标签 c++ c unix semaphore barrier

我正在尝试实现一个等待 N 个进程继续的收集函数。

struct sembuf operations[2];

operaciones[0].sem_num = 0; 
operaciones[0].sem_op = -1; // wait() or p()

operaciones[1].sem_num = 0; 
operaciones[1].sem_op = 0; // wait until it becomes 0

semop ( this->id,operations,2 );

最初,信号量的值为N。

问题在于,即使所有进程都执行了 semop 函数,它也会卡住。我认为这与操作是原子执行的这一事实有关(但我不知道它到底意味着什么)。但我不明白为什么它不起作用。

如果不是最后一个进程,代码是否会从信号量中减去 1,然后阻止该进程,或者代码是否应该以不同的方式运行?

最佳答案

如果没有整个函数和算法,很难看出代码的作用。 从表面上看,您在单个原子操作中应用了 2 个操作:从信号量中减去 1 并等待 0。 如果所有进程都卡住,可能会出现几个问题;信号量不是在所有进程之间共享的,当启动信号量时,进程数量错误,或者一个进程离开屏障,稍后增加信号量并返回屏障。 我建议调试以查看所有进程实际上都处于屏障状态,甚至可能在每次对信号量执行任何操作时进行打印(最好在同一控制台上)。

至于什么是原子 Action 是;它是保证在执行时不被中断的单个操作或操作序列。这意味着没有其他进程/线程会干扰该操作。

关于c++ - 使用 System V 信号量创建聚集/屏障函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43601886/

相关文章:

linux - 更改文件中的日期格式

c++ - 自动生成 C++ 源文件和头文件(反之亦然)文件

c - 什么时候需要减少?

c++ - 当变量不是局部变量时我应该继续返回吗

c - 哦不!在 C 中的以下程序中获取核心转储

c++ - 等待输入一段时间

linux - Nano 在 Vim 中的查找和替换?

c - C中udp套接字上的poll()POLLIN事件

c++ - 如何在 Rcpp 中加快 xts 数据到 Datetime Vector 的转换?

c++ - _L_unlock_16的性能瓶颈