Не очень элегантно, и в этом есть куча накладных расходов - но это имеет смысл, а не какой-то сумасшедший взлом.

аюсь реализовать кроссплатформенный код на 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 и реализует тот же интерфейс, используя монотонные часы.

Это звучит как много работы - и вроде беспорядка. Есть ли другой способ обойти эту проблему?

Ответы на вопрос(4)

Ваш ответ на вопрос