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