我正在使用 boost::chrono::high_resolution_clock::now();
有时得到:
Boost::Chrono - Internal Error.
我的应用程序是多线程的,所以有人知道 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 行
最佳答案
也许存在某种重入问题?我在 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
,它接受 system::error_code 并且不断言。第二个建议是要么禁用断言,要么通过 BOOST_ENABLE_ASSERT_HANDLER 为 Boost 提供断言处理程序...参见 assert.hpp .
关于c++ - boost::chrono::high_resolution_clock::now() 断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651198/