0
我试图实现一个等待N个进程继续的聚集函数。使用System V信号灯制作聚集/屏障功能
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,然后阻止进程,如果它不是最后一个或代码应该以不同的方式进行操作?
您的代码会阻止进程,直到信号量0变为可减少的数量为止,此时它会递减,同时信号量1变为0.这是一个单一的全有或全无的事务。 – PSkocik