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 で同じエラーが発生し、確認するたびに 2 つのスレッドで同時にアサーションが発生しました。

残念ながら、boost\chrono\detail\inlined\win\chrono.hpp の 42 行目で QueryPerformanceCounter 呼び出しが失敗し、アサーション エラーが発生することがあります。

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

このエラーにはブースト チケットがありますが、あまりアクティビティがありません。 https://svn.boost.org/trac/boost/ticket/8006

QueryPerformanceCounter への引数が必要に応じて QWord に合わせられていることを確認したので、それは問題ではありません。

この問題に対処するための提案が 2 つあります。最初の提案は、system::error_code を受け入れ、アサートしない、もう 1 つのオーバーロードをに使用することです。now2 番目の提案は、アサートを無効にするか、BOOST_ENABLE_ASSERT_HANDLER を介して Boost にアサート ハンドラーを提供することです... assert.hppを参照してください。

于 2013-11-22T06:08:36.763 に答える