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