0

我正在使用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 行

4

1 回答 1

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 对齐的,根据需要,所以这不是问题。

我有两个解决这个问题的建议。第一个建议是使用另一个重载for now,它接受 system::error_code 并且不断言。第二个建议是禁用断言,或者通过 BOOST_ENABLE_ASSERT_HANDLER 为 Boost 提供断言处理程序...参见assert.hpp

于 2013-11-22T06:08:36.763 回答