在C中使用sem_wait时执行某些操作

时间:2015-01-01 16:42:17

标签: c while-loop posix semaphore

我试图避免使用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错误。

非常感谢任何帮助,谢谢!

2 个答案:

答案 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) {
    ...
}