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