没有sem_getvalue的信号量不工作?

时间:2014-10-12 02:10:46

标签: c multiprocessing semaphore

我真的很困惑为什么这不起作用,因为大多数关于信号量的例子是多线程的而不是多处理的,我有点难过。除非我把它放在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信号量。

1 个答案:

答案 0 :(得分:0)

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

相关问题