2017-02-14 6 views
1

Я реализую свой собственный класс Future, построенный на основе функции ожидания третьего лица thirdPartyWait(int milliseconds). Я хочу, чтобы мой Future был совместим с интерфейсом std::future, что означает, что я хотел бы предоставить как wait_for, так и wait_until.Могу ли я преобразовать wait_until для wait_for использования now()?

wait_for легко, так как он напрямую связан с thirdPartyWait (я могу обрабатывать преобразование в миллисекунды внутри него). Однако wait_until не отображается так красиво. Наглядно, я бы предположить следующее должен делать то, что я хочу:

template <class Clock, class Duration> 
std::future_status wait_until(const std::chrono::time_point<Clock, Duration> &timeout) const 
{ 
    return wait_for(timeout - Clock::now()); 
} 

Я проверил код и он работает, но я хорошо знаю, простой тест не распространяется на все случаи углу. Я не достаточно хорошо знаком с chrono части std, чтобы быть уверенным, поэтому мой вопрос:

Есть ли какие-либо скрытые подводные камни в моей реализации wait_until, или я могу ожидать, что она работает как задумано?

+1

Что произойдет, если 'Clock :: rep' беззнаковым и' timeout' уже в прошлом? –

ответ

2

cppreference это сказать о std::future::wait_until:

Часы привязаны к timeout_time используется, который не обязан быть монотонной clock.There никаких гарантий относительно поведения этой функции, если часы но существующие реализации конвертируют timeout_time из Clock в std :: chrono :: system_clock и делегируют POSIX pthread_cond_timedwait, так что ожидание оправдывает корректировки системных часов, но не часами, предоставляемыми пользователем. В любом случае, функция также может ждать дольше, чем до тех пор, пока не будет достигнуто время timeout_time из-за запланированных или задержек конкуренции ресурсов.

Из чего я заключаю, что текущие реализации выполняются именно так, как вы это делаете.

http://en.cppreference.com/w/cpp/thread/future/wait_until