一部の人々は、次の質問の受け入れられた回答のように、boost::bind() 関数を使用して boost::threads を起動しているようです:
この質問の賛成票が最も多い回答のように、他の人はまったく使用しません。
C++ クラスのメンバーとしてスレッドを開始する最良の方法は?
それで、それが存在する場合、違いは何ですか?
一部の人々は、次の質問の受け入れられた回答のように、boost::bind() 関数を使用して boost::threads を起動しているようです:
この質問の賛成票が最も多い回答のように、他の人はまったく使用しません。
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 を外部で使用しても、そのまま通過するため、2 倍になって内部的に呼び出されることはありません。
違いはありませんthread
-contructorはbind
内部で使用します。Boost.Threadには1.36より前の「バインディング」コンストラクターbind
がなかったため、人々は歴史的な理由で明示的に使用します。
はboost::bind
メンバー関数をスレッドにバインドするために使用されますが、boost :: bindを使用しない場合は、通常、静的関数またはフリー関数をスレッドで使用します。
主な違いは、静的メンバー関数と非静的メンバー関数のどちらをインターフェースするかです。スレッドによって起動される関数として非静的メンバー関数を使用する場合は、のようなものを使用する必要がありますbind
。
提案された代替案(リンクした2番目の質問)は、クラスオブジェクトへのポインターを受け取り、そのメンバーのいずれかを呼び出すことができる静的メソッドを使用することです。これにより構文が少し明確になりますが、(私にとって)最大の利点は、Boost
getのようなものを含める必要がないことですbind
。しかし、あなたが使用しているなら、あなたboost::threads
も取るかもしれませんboost::bind
。C ++ 11には、Boostなどの追加の依存関係を導入せずにstd::bind
使用できるようになっていることに注意してください。ただし、C++11を使用bind
する場合はそうです。pthreads
bind
メンバー関数を呼び出す静的メソッドを使いすぎないようにするための説得力のある構文上の理由はわかりません。しかし、それは個人的な好みの問題です。