Обыдно, блин. std::chrono::steady_clock, который даже по документации от M$ должен быть steady и monotonic, на самом деле, в MSVC++2013 нифига не steady и не monotonic. Как следствие, и такие функции, как std::this_thread::sleep_for или std::condition_variable::wait_until.
Тогда как тоже самое в MinGW-w64 (GCC 4.9.1 в варианте Posix) работает именно так, как нужно. Т.е. и steady, и monotonic.
И таки да, в Интернетах про эту проблему VC++ пишут, но читаешь такие вещи, только когда сам наступишь. Говорят, что в MSVC++2014 уже исправят.
Для желающих проверить маленькая самодостаточная программка. Она должна работать две минуты. Если в процессе ее работы менять время на компьютере вперед или назад, на программу это не должно оказывать влияния.
#include <iostream> #include <ctime> #include <thread> #include <chrono> int main() { using namespace std::chrono; auto t1 = steady_clock::now(); auto future = t1 + minutes( 2 ); while( future > steady_clock::now() ) { std::time_t t = std::time( NULL ); std::cout << std::ctime( &t ) << std::flush; std::this_thread::sleep_for( seconds( 1 ) ); } auto t2 = std::chrono::steady_clock::now(); std::cout << "steady_clock_time: " << duration_cast< seconds >( t2 - t1 ).count() << std::endl; } |
Комментариев нет:
Отправить комментарий