我试图实现一个等待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,然后阻止该过程,如果它不是最后一个,或者代码应该以不同的方式行事?
答案 0 :(得分:0)
如果没有整个功能和算法,很难看到代码的作用。 通过它的外观,您可以在单个原子动作中应用2个动作:从信号量中减去1并等待0。 如果所有进程都冻结,可能会有几个问题;信号量不是所有进程之间共享的,当启动信号量时,你得到的进程数量错误,或者一个进程离开了障碍,稍后会增加信号量并返回到屏障。 我建议调试以查看所有进程实际上都处于障碍状态,甚至可能每次在信号量上执行任何操作时打印(最好是在同一个控制台上)。
至于什么是原子动作;它是一个或一系列操作,保证在执行时不被中断。这意味着没有其他进程/线程会干扰操作。