gpt4 book ai didi

c - 没有 sem_getvalue 信号量无法工作?

转载 作者:行者123 更新时间:2023-11-30 17:27:40 30 4
gpt4 key购买 nike

我真的很困惑为什么这不起作用,而且由于大多数有关信号量的示例都是多线程的而不是多处理的,我有点困惑。除非我将其放在 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 打开的命名信号量上调用它会调用未定义的行为。这可能是您问题的根源。您正在破坏使用新的匿名非进程共享信号量打开的命名进程共享信号量,即使它没有调用未定义的行为,这在语义上也是错误的。

关于c - 没有 sem_getvalue 信号量无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321158/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com