boost :: chrono :: high_resolution_clock :: now()断言

时间:2012-07-25 13:46:52

标签: c++ multithreading boost

我正在使用boost::chrono::high_resolution_clock::now(); 有时得到:

  

Boost :: Chrono - 内部错误。

我的应用程序是多线程的,所以任何人都知道now()函数是否是线程安全的吗?

我查看了now()函数的实现,它使用了一个static变量,这可能意味着它不是线程安全的。

我的代码如下所示:

auto algTimer = boost::chrono::high_resolution_clock::now();

我得到的消息指出:

C:\ boost \ boost_1_48_0 \ boost \ chrono \ detail \ inlined \ win \ chrono.hpp第44行

1 个答案:

答案 0 :(得分:2)

也许存在某种可重入问题?我在Windows上与Boost 1.55有相同的错误,每次我检查断言同时发生在两个线程中。

不幸的是,有时QueryPerformanceCounter调用在boost \ chrono \ detail \ inlined \ win \ chrono.hpp的第42行失败,导致断言错误。

if ( (nanosecs_per_tic <= 0.0L) ||
        (!boost::detail::winapi::QueryPerformanceCounter( &pcount )) )
{
  BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
  return steady_clock::time_point();
}

此错误有一个Boost票证,但活动不多。 https://svn.boost.org/trac/boost/ticket/8006

我验证了QueryPerformanceCounter的参数是QWord对齐的,required,所以这不是问题。

我有两个解决此问题的建议。第一个建议是使用other overload now,它接受​​一个系统:: error_code并且不断言。第二个建议是禁用断言,或通过BOOST_ENABLE_ASSERT_HANDLER为Boost提供断言处理程序...参见assert.hpp