c++ - boost::chrono::high_resolution_clock::now() 断言

标签 c++ multithreading boost

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

相关文章:

c++ - unique_lock 可以与 recursive_mutex 一起使用吗?

c# - InvalidOperationException:集合已修改;指的是哪个集合?

c++ - 如何使第三方库线程安全以用于 Boost 线程?

c++ - Boost Graph 边缘比较不起作用

c++ - 中断用户输入,否则继续

c++ - IAR 6.50 在项目构建时显示多个错误

c++ - 在命令行或从 CMake 指定用于 Visual Studio 代码分析的规则集

C++ - 位图的 10 种最流行的颜色

c++ - 我可以在一个线程中写入变量并在 C++ 中的另一个线程中读取它吗

c++ - boost 不可复制的怪异性