使用 System V 信号量制作聚集/屏障功能

Posted

技术标签:

【中文标题】使用 System V 信号量制作聚集/屏障功能【英文标题】:Making a gather/barrier function with System V Semaphores 【发布时间】:2017-09-21 22:47:06 【问题描述】:

我正在尝试实现一个等待 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,然后如果它不是最后一个进程,或者代码应该以不同的方式运行,是否会阻止进程?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 System V 信号量制作聚集/屏障功能的主要内容,如果未能解决你的问题,请参考以下文章

System V 信号量使用相关函数

System v 和Posix的主要功能和定义

使用互斥量和信号量的屏障实现

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

修改为“使用信号量实现 N 进程屏障”

正确销毁命名的 System V 信号量