一种经常推荐的信号量定时等待方法是(为简洁起见进行了简化(:
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
指示检测到死锁。