понедельник, 8 сентября 2014 г.

[prog.bugs] std::chrono::steady_clock в MSVC++2013 нифига не steady

Обыдно, блин. 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;
}

Комментариев нет: