我试图避免使用sem_wait,并且有类似的东西: "在等待信号量时,做一些事情"。 所以我发现了sem_getvalue,它应该在成功的情况下返回0。
所以我用:
启动信号量sem_init(&sem1, 0, 0);
而不是
sem_wait(&sem1);
我需要类似的东西:
while(sem_getvalue(&sem1, 2) < 0){
printf("do this\n");
}
我对sem_wait没有任何问题,一切似乎都正常运行。 但是第二个,我在执行期间遇到了Segmentation fault错误。
非常感谢任何帮助,谢谢!
答案 0 :(得分:5)
由于你失去了原子性,你不应该使用sem_getvalue
。使用sem_trywait
执行任务
for (;;) {
if (sem_trywait(&sem1)) {
if (errno != EAGAIN) {
/* handle error */
abort();
}
errno = 0;
printf("do this\n");
} else {
break;
}
}
答案 1 :(得分:2)
sem_getvalue
返回一个状态,并将信号量值放在作为第二个参数传递的指针处。您需要检查返回状态(函数成功时为零),然后检查信号量值,如下所示:
int sval1;
if (sem_getvalue(&sem1, &sval1) == 0 && sval1 < 0) {
...
}