【发布时间】:2014-05-12 09:01:19
【问题描述】:
以下代码有问题:
#include "updaterankparams.hpp"
int main()
{
sem_id = semget(SEM_KEY, 1, 0);
while(true)
{
printf("want to lower: %d\n", semctl(sem_id, 0, GETVAL));
semop(sem_id, &P, 1);
printf("lowered: %d\n", semctl(sem_id, 0, GETVAL));
scanf("%*c");
puts("t");
semop(sem_id, &V, 1);
}
return 0;
}
在哪里
static sembuf P =
{
0,
-1,
0
};
static sembuf V =
{
0,
1,
0
};
我得到的输出是:
done
want to lower: 0
lowered: 0
t
want to lower: 1
lowered: 0
t
want to lower: 1
lowered: 0
当我输入字符以满足循环中的 printf 时,它会无限循环。 但是我希望进程在尝试降低值已经为零的信号量时停止(睡眠)。虽然,没有任何事情发生!我知道这可能是一件愚蠢的事情,而且解决方案也很简单,但这是其中一个非常愚蠢的错误,我想甚至没有人在网上要求解决方案。
只是为了澄清:没有其他进程使用信号量,并且它已在其他(现已关闭)进程中使用:
sem_id = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
感谢大家的帮助!
【问题讨论】:
-
能否请您发布足够的代码,以便我们运行它并观察您的问题?
-
您在循环中执行 P 和 V,P 始终为值 1。它应该在哪里停止,为什么?
-
如果你想运行它,只需将带有 semget 的行添加到代码中并用一些整数定义 SEM_KEY,例如2000000001