11

一部の人々は、次の質問の受け入れられた回答のように、boost::bind() 関数を使用して boost::threads を起動しているようです:

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

この質問の賛成票が最も多い回答のように、他の人はまったく使用しません。

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

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

4

5 に答える 5

13

以下のコードからわかるように、コンパイルして期待される出力が得られます。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 倍になって内部的に呼び出されることはありません。

于 2012-12-06T11:39:16.860 に答える
11

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

于 2012-12-06T12:42:38.297 に答える
1

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

于 2012-12-06T11:32:20.530 に答える
0

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

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

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

于 2012-12-06T11:32:37.183 に答える