c - 进程同步、信号量如何让输出顺序随机?

标签 c synchronization semaphore

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/

相关文章:

php - 在未启用远程 SQL 访问的情况下将数据从本地 SQL 数据库放入远程 SQL 数据库 (PHP)

iOS/OSX 相当于 SetEvent() 和 WaitForSingleObject()?

c++ - C 函数调用产生与 C++ 函数调用不同的结果

c - Free() 函数导致程序崩溃

c - 函数中的 Printf 更改 main 中的输出值

c - spoj NAJPWG 的解决方案。给予 TLE

elasticsearch - Logstash将Mongo数据同步到ElasticSearch

java - 方法是否需要同步?

linux - Linux 中的信号量和共享内存

c# - 在 IDisposable 派生类中应该在哪里释放单例互斥量?