我真的很困惑为什么它不起作用,并且由于有关信号量的大多数示例都是多线程的,而不是多进程的,所以我很困惑。除非将其放在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更改了信号量,因此只能通过存储在共享内存中来共享它们吗?但是如何初始化sem_open信号量而不设计一些任意的while循环。
最佳答案
sem_init
用于创建匿名信号灯。在通过sem_open
打开的命名信号量上调用它会调用未定义的行为。这可能是您问题的根源。您正在使用新的匿名非进程共享信号来破坏您打开的命名进程共享信号,即使它没有调用未定义的行为,从语义上讲也是错误的。