在 C 中 sem_wait 时做某事

Do something while sem_wait in C

我正在努力避免使用 sem_wait,并且有类似的东西: "While waiting for semaphore, do something"。 然后我发现了 sem_getvalue 如果成功,它应该是 return 0。

所以我启动信号量:

sem_init(&sem1, 0, 0);

而不是

sem_wait(&sem1);

我需要这样的东西:

while(sem_getvalue(&sem1, 2) < 0){
    printf("do this\n");
}

我对 sem_wait 没有任何问题,似乎一切正常。 但是第二个,我在执行过程中遇到了分段错误。

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

sem_getvalue return 是一个状态,并将信号量值放在作为第二个参数传递的指针处。您需要检查 return 状态(函数成功时为零),然后才检查信号量值,如下所示:

int sval1;
if (sem_getvalue(&sem1, &sval1) == 0 && sval1 < 0) {
    ...
}

你不应该为此使用 sem_getvalue,因为你正在失去原子性。使用 sem_trywait 完成任务

for (;;) {
  if (sem_trywait(&sem1)) {
     if (errno != EAGAIN) {
         /* handle error */
         abort();
     }
     errno = 0;
     printf("do this\n");
  } else {
     break;
  }
}