1

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

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退出?

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

4

1 回答 1

1

假设信号量未发布到(即预期超时),while 循环是否保证在 ts 中指定的时间(或稍晚)退出?即是否保证while循环不会在ts中指定的时间之前退出?

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

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

于 2020-01-17T22:32:53.323 回答