int main() {
sem_t * sem;
sem = sem_open("share", O_CREAT, 0 ,1);
sem_unlink("share");
int i;
if (fork()) {
for (i=0;i<10;i++) {
sem_wait(sem);
display("Hello world\n");
sem_post(sem);
}
wait(NULL);
} else {
for (i=0;i<10;i++) {
sem_wait(sem);
display("Bonjour monde\n");
sem_post(sem);
}
}
return 0;
}
我正在尝试在进程之间进行同步,它工作得很好,但是子进程在父进程完成后(在 10 个 Hello worlds 之后)开始记录 Bonjour monde 文本。输出顺序可以像
那样随机吗Hello World
Bonjour monde
Bonjour monde
Hello World
....
而不是 10 个 Hello Worlds,然后是 10 个 Bonjour mondes。
最佳答案
您似乎对“随机”输出的期望比表面上的意思更强烈。关于输出顺序,您的原始代码确实是不确定的(即 随机)。从长远来看,这可能会更清楚。它恰好不喜欢从一个输出切换到另一个输出,因此输出会聚集,但这并不意味着它是非随机的。
由于您对确定性交替也不满意,我想您的意思是每行每个输出的机会均等,与前一行不相关。在那种情况下,具有讽刺意味的是,你需要施加一些控制。例如,您可以采用@CraigEstey 的双信号量解决方案,这样每个进程都可以通过伪随机数生成器(例如 rand()
。我将详细信息留作练习。
关于c - 进程同步、信号量如何让输出顺序随机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53796602/