使用 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 信号量制作聚集/屏障功能的主要内容,如果未能解决你的问题,请参考以下文章