sem_timedwait with EINTR-check 是否保证等待 >= 指定时间?
Is sem_timedwait with EINTR-check guaranteed to wait >= the specified time?
经常推荐的信号量定时等待方法是(为简洁起见进行了简化):
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 5;
ts.tv_nsec += 3;
while (sem_timedwait(&sem, &ts) == -1 && errno == EINTR)
continue;
假设信号量没有被发送到(即预期超时),while-loop 保证在ts
中指定的时间退出(或稍后)? IE。是否保证 while 循环不会在 ts
中指定的时间 之前 退出?
我不太记得观察 sem_timedwait()
在 ts
- 中指定的时间 之前略微退出 但我不记得是否那是因为我没有使用 EINTR
-check。我确实记得有一段时间我不太明白 EINTR
-check 的用途,所以我单独使用了 sem_timedwait()
,没有结合 while 循环和 EINTR
-check_.
Assuming the semaphore is not posted-to (i.e. timeout is expected), is
the while-loop guaranteed to exit at the time specified in ts (or
slightly later)? I.e. is it guaranteed that the while-loop will not
exit before the time specified in ts?
这取决于您所说的 "guaranteed" 是什么意思,但是 the specifications 对于 sem_timedwait
没有规定它会在指定时间到期之前超时。但是,由于其他原因,它可能会更快失败,所以从这个意义上说,不,不能保证示例 while
循环将 运行 指定的全部时间。
特别是,即使所有参数均有效且调用未被信号中断,sem_timedwait()
也被明确允许失败并显示 EDEADLK
以指示检测到死锁。
经常推荐的信号量定时等待方法是(为简洁起见进行了简化):
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 5;
ts.tv_nsec += 3;
while (sem_timedwait(&sem, &ts) == -1 && errno == EINTR)
continue;
假设信号量没有被发送到(即预期超时),while-loop 保证在ts
中指定的时间退出(或稍后)? IE。是否保证 while 循环不会在 ts
中指定的时间 之前 退出?
我不太记得观察 sem_timedwait()
在 ts
- 中指定的时间 之前略微退出 但我不记得是否那是因为我没有使用 EINTR
-check。我确实记得有一段时间我不太明白 EINTR
-check 的用途,所以我单独使用了 sem_timedwait()
,没有结合 while 循环和 EINTR
-check_.
Assuming the semaphore is not posted-to (i.e. timeout is expected), is the while-loop guaranteed to exit at the time specified in ts (or slightly later)? I.e. is it guaranteed that the while-loop will not exit before the time specified in ts?
这取决于您所说的 "guaranteed" 是什么意思,但是 the specifications 对于 sem_timedwait
没有规定它会在指定时间到期之前超时。但是,由于其他原因,它可能会更快失败,所以从这个意义上说,不,不能保证示例 while
循环将 运行 指定的全部时间。
特别是,即使所有参数均有效且调用未被信号中断,sem_timedwait()
也被明确允许失败并显示 EDEADLK
以指示检测到死锁。