Я пытаюсь внедрить кросс-платформенный код в C ++ 11. Часть этого кода реализует объект семафора, используя wait_until . Когда мне нужно выполнить время ожидания на семафоре, я использую wait_until или wait_for.
Проблема, которую я испытываю, заключается в том, что стандартная реализация condition_variable в системах на основе POSIX зависит от системных часов, а не от монотонных часов (см. Также: эта проблема против спецификации POSIX )
Это означает, что если системные часы будут изменены до некоторого времени в прошлом, моя переменная состояния будет блокироваться намного дольше, чем я ожидаю. Например, если я хочу, чтобы мое condition_variable таймаутировалось через 1 секунду, если кто-то настраивает часы на 10 минут во время ожидания, condition_variable блокирует 10 минут + 1 секунду. Я подтвердил, что это поведение в системе Ubuntu 14.04 LTS.
Мне нужно полагаться на этот таймаут, чтобы быть хотя бы несколько точным (т. Е. Он может быть неточным в пределах некоторого предела погрешности, но все равно необходимо выполнить, если системные часы меняются). Похоже, что мне нужно будет написать свою собственную версию condition_variable, которая использует функции POSIX и реализует один и тот же интерфейс, используя монотонные часы.
Это звучит как «Много работы» - и вроде беспорядок. Есть ли другой способ обойти эту проблему?
c++,c++11,time,condition-variable,system-clock,