web-dev-qa-db-ja.com

boost :: bind()を使用する場合と使用しない場合のboost :: threadの作成

次の質問の受け入れられた答えのように、boost :: bind()関数を使用してboost :: threadsを起動するように見える人もいます。

ブーストスレッドと非静的クラス関数を使用

他の人はそれをまったく使用しませんが、この質問の最も賛成の回答のように:

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

それで、それが存在する場合、違いは何ですか?

11
deinocheirus

以下のコードでコンパイルして期待される出力が得られることがわかるように、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を外部で使用しても、それが2倍になり、そのまま通過するため、内部で呼び出されることはありません。

13
goji

違いはありません-threadコンストラクターは内部でbindを使用します。 Boost.Threadには 1.36より前の「バインディング」コンストラクター がなかったため、歴史的な理由でbindを明示的に使用します。

10
Igor R.

それで、それが存在する場合、違いは何ですか?

主な違いは、スレッド関数内で何にアクセスする必要があるかです。

デザインでクラスインスタンスのデータにアクセスする必要がある場合は、クラスインスタンスの一部としてスレッドを起動します(boost::bindthisおよびメンバー関数、または静的メンバー関数とvoid*thisにマップされます-これは主にスタイルの問題です)。

スレッド関数が特定のオブジェクトのデータに依存しないことが設計で必要な場合は、free関数を使用してください。

1
utnapistim

boost::bindは、メンバー関数をスレッドにバインドするために使用されますが、boost :: bindを使用しない場合は、通常、静的関数またはフリー関数をスレッドで使用します。

1
Tony The Lion

主な違いは、静的メンバー関数と非静的メンバー関数のどちらをインターフェースするかです。スレッドによって起動される関数として非静的メンバー関数を使用する場合は、bindのようなものを使用する必要があります。

提案された代替案(リンクした2番目の質問)は、クラスオブジェクトへのポインターを受け取り、そのメンバーのいずれかを呼び出すことができる静的メソッドを使用することです。これにより構文が少し明確になりますが、(私にとって)最大の利点は、Boostを取得するためにbindのようなものを含める必要がないことです。ただし、boost::threadsを使用している場合は、boost::bindも使用することをお勧めします。 C++ 11にはstd::bindがあるため、bindpthreadsと一緒に使用して、Boostなどの追加の依存関係を導入することはできませんが、C++ 11を使用する場合はそうです。

メンバー関数を呼び出す静的メソッドよりもbindの使用を避けるための説得力のある構文上の理由はわかりません。しかし、それは個人的な好みの問題です。

0
tpg2114