使用 System V 信号量创建 gather/barrier 函数
Making a gather/barrier function with System V Semaphores
我正在尝试实现一个等待 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,然后在不是最后一个时阻止进程,或者代码是否应该以不同的方式运行?
如果没有完整的功能和算法,很难看出代码的作用。
从外观上看,您在单个原子操作中应用了 2 个操作:从信号量中减去 1 并等待 0。
如果所有进程都冻结,可能会出现几个问题;信号量并非在所有进程之间共享,启动信号量时进程数错误,或者一个进程离开屏障,稍后增加信号量并将 returns 增加到屏障。
我建议调试以查看所有进程实际上都处于障碍状态,甚至可能在每次对信号量执行任何操作时打印(最好在同一控制台上)。
至于什么是原子动作;它是保证在执行时不被中断的单个操作或操作序列。这意味着没有其他 process/thread 会干扰该操作。
我正在尝试实现一个等待 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,然后在不是最后一个时阻止进程,或者代码是否应该以不同的方式运行?
如果没有完整的功能和算法,很难看出代码的作用。 从外观上看,您在单个原子操作中应用了 2 个操作:从信号量中减去 1 并等待 0。 如果所有进程都冻结,可能会出现几个问题;信号量并非在所有进程之间共享,启动信号量时进程数错误,或者一个进程离开屏障,稍后增加信号量并将 returns 增加到屏障。 我建议调试以查看所有进程实际上都处于障碍状态,甚至可能在每次对信号量执行任何操作时打印(最好在同一控制台上)。
至于什么是原子动作;它是保证在执行时不被中断的单个操作或操作序列。这意味着没有其他 process/thread 会干扰该操作。