0

作成した boost::thread が別のスレッドから実行されているかどうかを確認する必要があります。このSO 投稿では、次のように呼び出してこれを行うことができると説明しています。

boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);

クライアント スレッドにクリティカル セクションを含めることができません。timed_join()時間引数が 0 の場合にロックフリーであることを保証できますか?

4

2 に答える 2

1

Boost.Thread は、ロックフリーについての保証を提供しませんtimed_join()。ただし、実装は常に変更される可能性があります。

  • Boost.Thread は、pthreads のミューテックスを取得し、条件変数で時間指定待機を実行します。
  • WaitForMultipleObjectsWindows のBoost.Thread 呼び出し。そのドキュメントは、常にすぐに戻ることを示しています。ただし、基盤となる OS の実装がロックフリーかどうかはわかりません。

別の方法として、アトミック操作の使用を検討してください。Boost 1.52 は現在、パブリック アトミック ライブラリを提供していませんが、Boost.Smart_Ptr と Boost.Interprocess の両方が詳細名前空間内にアトミック整数を持っています。ただし、これらはどちらもロックフリーの実装を保証するものではなく、Boost.Smart_Ptr の構成の 1 つが でロックされpthread mutexます。したがって、コンパイラとシステムのドキュメントを調べて、ロックのない実装を特定する必要がある場合があります。

それにもかかわらず、ここに を使用した小さな例がありますboost::detail::atomic_count:

#include <boost/chrono.pp>
#include <boost/detail/atomic_count.hpp>
#include <boost/thread.hpp>

// Use RAII to perform cleanup.
struct count_guard
{
  count_guard(boost::detail::atomic_count& count) : count_(count) {}
  ~count_guard() { --count_; }
  boost::detail::atomic_count& count_;
};

void thread_main(boost::detail::atomic_count& count)
{
  // Place the guard on the stack. When the thread exits through either normal
  // means or the stack unwinding from an exception, the atomic count will be
  // decremented.
  count_guard decrement_on_exit(count);
  boost::this_thread::sleep_for(boost::chrono::seconds(5));
}

int main()
{
  boost::detail::atomic_count count(1);
  boost::thread t(thread_main, boost::ref(count));

  // Check the count to determine if the thread has exited.
  while (0 != count)
  {
    std::cout << "Sleeping for 2 seconds." << std::endl;
    boost::this_thread::sleep_for(boost::chrono::seconds(2));
  }
}

この場合、拡張機能はRAIIat_thread_exit()を使用する代わりに使用できます。

于 2013-01-25T16:49:09.597 に答える
1

いいえ、そのような保証はありません。
ブーストの実装が完全にロックフリーであっても (私はチェックしていません)、基盤となる OS の実装が完全にロックフリーであるという保証はありません。

とはいえ、ここでロックが使用された場合、アプリケーションで大幅な遅延が発生する可能性は低いと思われるため、timed_joinリアルタイムで厳しい締め切り ( UI の応答性とは関係ありませ) がない限り、使用をためらうことはありません。 )。

于 2013-01-25T13:09:05.477 に答える