首页 > 解决方案 > 理解 sem_timedwait()

问题描述

我正在阅读手册sem_timedwait(),但无法弄清楚示例。我目前的理解是:

所以我理解 if 语句,但是我不理解 while 循环。所以它会在sem_timedwait()返回错误(?)时循环,而当它被sem_post()调用发出信号时?(我显然不明白 的定义"EINTR The call was interrupted by a signal handler"

来自男人的例子:

while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
    continue;       /* Restart if interrupted by handler */

/* Check what happened */

if (s == -1) {
    if (errno == ETIMEDOUT)
        printf("sem_timedwait() timed out\n");
    else
        perror("sem_timedwait");
} else
    printf("sem_timedwait() succeeded\n");

我认为它的工作方式类似于:

s = sem_timedwait(&sem, &ts)
if (errno == ETIMEDOUT) {
    // timed out after specified ts
}
else if (s == -1) {
    // error occurred
}
else {
    // interrupted by `sem_post()`, do something relying on shared resource
}

标签: csemaphore

解决方案


while循环:

while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
    continue;       /* Restart if interrupted by handler */

将循环直到sem_timedwait调用成功(即sem_post()发生)或发生错误以外的错误EINTR

错误会被EINTR特殊处理,因为sem_timedwait调用可以随时被信号中断。这不会被视为错误,而是被视为中断(就是这样,并且在这种情况下会重试调用。


推荐阅读