Гарантируется ли sem_timedwait с EINTR-проверкой ожидание> = указанное время? - PullRequest
1 голос
/ 18 января 2020

Часто рекомендуемый подход к временному ожиданию на семафоре (упрощенный для краткости):

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;

Предполагая, что семафор не размещен (т.е. ожидается тайм-аут), это время l oop гарантировано для выхода во время, указанное в ts (или чуть позже)? Т.е. гарантируется ли, что while-l oop не выйдет до времени, указанного в ts?

Я наполовину помню, как наблюдал sem_timedwait(), слегка выходящий до время, указанное в ts - , но я не могу вспомнить, было ли это потому, что я не использовал EINTR -check . Я помню, что было время, когда я не совсем понимал, для чего нужна проверка EINTR, поэтому я использовал только sem_timedwait(), а не в сочетании с while-l oop и EINTR -check_.

1 Ответ

1 голос
/ 18 января 2020

Если семафор не размещен (т. Е. Ожидается тайм-аут), гарантировано ли время while-l oop на выход, указанный в ts (или чуть позже)? Т.е. гарантируется ли, что while-l oop не выйдет раньше времени, указанного в ts?

Это зависит от того, что вы подразумеваете под "гарантированным", но спецификации для sem_timedwait не предусматривайте тайм-аут до истечения указанного времени. Однако по другим причинам он может потерпеть неудачу раньше, поэтому в этом смысле нет, не гарантируется, что пример while l oop будет работать в течение указанного времени.

В частности, даже если все аргументы действительны, и вызов не прерывается сигналом, sem_timedwait() явно разрешено завершать с ошибкой EDEADLK, чтобы указать, что обнаружена тупиковая ситуация.

...