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

Wil*_*ban 2 c posix semaphore while-loop

我试图避免使用sem_wait,并且有类似的东西:"在等待信号量时,做一些事情".所以我发现了sem_getvalue,它应该在成功的情况下返回0.

所以我用以下方式启动信号量:

sem_init(&sem1, 0, 0);
Run Code Online (Sandbox Code Playgroud)

而不是

sem_wait(&sem1);
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

while(sem_getvalue(&sem1, 2) < 0){
    printf("do this\n");
}
Run Code Online (Sandbox Code Playgroud)

我对sem_wait没有任何问题,一切似乎都正常运行.但是第二个,我在执行期间遇到了Segmentation fault错误.

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

Jen*_*edt 5

你不应该使用sem_getvalue这个,因为你失去了原子性.使用sem_trywait该任务

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