c语言 - 带有 EINTR-check 的sem_timedwait是否保证等待 >= 指定时间?



一种经常推荐的信号量定时等待方法是(为简洁起见进行了简化(:

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循环是否保证ts中指定的时间(或稍晚(退出? 即是否保证 while 循环不会在ts中指定的时间之前退出?

我半记得在ts中指定的时间之前观察到sem_timedwait()退出 -但我不记得那是因为我没有使用EINTR检查。我确实记得有一段时间我不太明白EINTR-check 的用途,所以我单独使用sem_timedwait(),而不是与 while-loop 和EINTR-check_ 结合使用。

假设信号灯未发布到(即预期超时(,则为 保证在 TS 中指定的时间退出的 while 循环(或 稍晚一点(?即是否保证 while-loop 不会 在 TS 中指定的时间之前退出?

这取决于您所说的"保证"是什么意思,但sem_timedwait规范没有规定它在指定时间到期之前超时。 但是,由于其他原因,它可能会更快地失败,因此从这个意义上说,不,不能保证示例while循环将在指定的时间内运行。

特别是,即使所有参数都有效并且调用未被信号中断,也显式允许sem_timedwait()失败,并EDEADLK指示检测到死锁。

最新更新