2017-04-25 88 views
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

您的代码会阻止进程,直到信号量0变为可减少的数量为止,此时它会递减,同时信号量1变为0.这是一个单一的全有或全无的事务。 – PSkocik

回答

0

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

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