1. ホーム
  2. c++

[解決済み] boost::bind()を使用して、または使用せずにboost::threadを作成する。

2022-02-16 23:41:41

質問

以下の質問の回答例のように、boost::bind()関数を使ってboost::threadsを起動する人がいるようです。

boostスレッドと非静的クラス関数の使用

一方、この質問で最も多くのアップヴォートを得た回答のように、全く使っていない人もいます。

C++クラスのメンバとしてスレッドを開始する最良の方法は?

では、違いがあるとすれば、それは何でしょうか?

解決方法は?

以下のコードをコンパイルして期待通りの出力を得ると、boost::bindはboost::threadを自由関数、メンバー関数、静的メンバー関数で使用するために全く必要ないことが分かります。

#include <boost/thread/thread.hpp>
#include <iostream>

void FreeFunction()
{
  std::cout << "hello from free function" << std::endl;
}

struct SomeClass
{
  void MemberFunction()
  {
    std::cout << "hello from member function" << std::endl;
  }

  static void StaticFunction()
  {
    std::cout << "hello from static member function" << std::endl;
  }
};

int main()
{
  SomeClass someClass;

  // this free function will be used internally as is
  boost::thread t1(&FreeFunction);
  t1.join();

  // this static member function will be used internally as is
  boost::thread t2(&SomeClass::StaticFunction);
  t2.join();

  // boost::bind will be called on this member function internally
  boost::thread t3(&SomeClass::MemberFunction, someClass);
  t3.join();
}

出力します。

hello from free function
hello from static member function
hello from member function

コンストラクタの内部バインドは、すべての作業を代行してくれます。

ただ、各関数型で何が起こるかについて、少しコメントを追加しました。(ソースを正しく読んでいればいいのですが!) 私が見る限り、boost::bindを外部で使用しても、そのまま通過するので内部でダブルアップして呼び出されることはありません。