#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
編集:あなたの編集を説明する、あなたはこのようにそれをしなければなりません:
std::thread spawn() {
return std::thread(&blub::test, this);
}
更新:私はいくつかのポイントを説明したいと思います、それらのいくつかはコメントでも議論されています。
上記の構文は、INVOKE定義(§20.8.2.1)の観点から定義されています。
INVOKE(f、t1、t2、...、tN)を次のように定義します。
- (t1。* f)(t2、...、tN)fがクラスTのメンバー関数へのポインターであり、t1がタイプTのオブジェクト、またはタイプTのオブジェクトへの参照、またはTから派生したタイプのオブジェクト。
- ((* t1)。* f)(t2、...、tN)fがクラスTのメンバー関数へのポインターであり、t1が前の項目で説明したタイプの1つではない場合。
- t1。*f(N == 1であり、fがクラスTのメンバーデータへのポインタであり、t 1がタイプTのオブジェクト、
またはタイプTのオブジェクトへの参照、または
から派生したタイプのオブジェクトへの参照である場合) T;
- (* t1)。* f N == 1であり、fがクラスTのメンバー・データへのポインターであり、t1が前の項目で説明したタイプの1つではない場合。
- 他のすべての場合はf(t1、t2、...、tN)。
私が指摘したいもう1つの一般的な事実は、デフォルトでは、スレッドコンストラクターが渡されたすべての引数をコピーするということです。この理由は、引数が呼び出し元のスレッドよりも長生きする必要がある場合があるためです。引数をコピーすると、それが保証されます。代わりに、実際に参照を渡したい場合は、std::reference_wrapper
によって作成されたを使用できますstd::ref
。
std::thread (foo, std::ref(arg1));
これを行うことにより、スレッドが引数を操作するときに引数がまだ存在することを保証することに注意を払うことを約束します。
上記のすべてのものは、およびにも適用できることに注意してstd::async
くださいstd::bind
。