2014-10-12 28 views
0

我真的很困惑,为什么这不起作用,并且因为大多数关于信号量的例子是多线程的,而不是多处理的,所以我很难过。我的代码不工作,除非我把这个上面的sem_wait。没有sem_getvalue的信号量不工作?

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 while循环。

回答

0

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

+0

为什么信号量没有设置值,特别是使用sem_open命名的值? – mobone 2014-10-12 02:20:12

+0

您在创建时设置了该值。在任何其他时间设置值都是竞争条件,而不是有用的操作。 – 2014-10-12 02:20:54

+0

但是,如果程序崩溃,sem_open不会重新初始化该值,那么该程序就会出现故障。我只是做了一个函数,在启动进程之前将sem值转换为正确的初始状态。 – mobone 2014-10-12 02:25:53