在 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;
}
}
我正在努力避免使用 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;
}
}