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