c-信号量在没有sem_getvalue的情况下无法工作



我真的很困惑为什么这不起作用,因为大多数关于信号量的例子都是多线程的,而不是多处理的,所以我有点困惑。我的代码不起作用,除非我把它放在sem_wait之上。

while (1)
    {
        int x;
        sem_getvalue(sem1, &x);
        if (x>0) break;
        sleep(1);
    }

本质上是我自己在做信号灯。。。这就像sem_wait只检查了一次值,然后就永远坐着。我有两个生产者和一个消费者。以下是它的结构:

Producer 1:
  sem_waits for sem1 (initially set to 1)
  sem_posts to sem2
Producer 2:
  sem_waits for sem2 (initially set to 0)
  sem_posts to sem1

没有这个代码段生成器2就永远不会运行。在生产者2中有这个片段,但不是1,生产者1运行,然后运行2,然后停止。两人都需要这个片段来做其他事情。。

我觉得我的问题在这里:

// sem open must be used to be used by multiple processes?
sem_t *sem1 = sem_open("producer", O_CREAT, 0644, 1);
sem_t *sem2 = sem_open("producer2", O_CREAT, 0644, 0);
sem_t *consumer_full = sem_open("cfull", O_CREAT, 0644, 0);
sem_t *consumer_empty = sem_open("cempty", O_CREAT, 0644, 0);
// sem_open remains in memory even after program exit.
// initialize to correct value to be sure
sem_init(sem1,0,1);
sem_init(sem2,0,0);
sem_init(consumer_full,0,0);
sem_init(consumer_empty,0,0);

sem_init更改信号量,使其只能通过存储在共享内存中来共享?但是,在不设计任意的do-while循环的情况下,如何初始化sem_open信号量呢。

sem_init用于创建匿名信号量。在通过sem_open打开的命名信号量上调用它会调用未定义的行为。这可能是你问题的根源。您正在用新的匿名非进程共享信号量破坏您打开的命名进程共享信号,即使它没有调用未定义的行为,这在语义上也是错误的。

相关内容

最新更新