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循环。
为什么信号量没有设置值,特别是使用sem_open命名的值? – mobone 2014-10-12 02:20:12
您在创建时设置了该值。在任何其他时间设置值都是竞争条件,而不是有用的操作。 – 2014-10-12 02:20:54
但是,如果程序崩溃,sem_open不会重新初始化该值,那么该程序就会出现故障。我只是做了一个函数,在启动进程之前将sem值转换为正确的初始状态。 – mobone 2014-10-12 02:25:53