#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つでない場合。
- N == 1であり、fがクラスTのメンバーデータへのポインターであり、t 1がT型
のオブジェクトであるか、T型のオブジェクトへの参照であるか、またはT
から派生した型のオブジェクトへの参照である場合のt1。* f T;
- (* t1)。* f N == 1で、fがクラスTのメンバーデータへのポインターで、t 1が前の項目で説明した型の1つでない場合。
- その他の場合はすべてf(t1、t2、...、tN)。
私が指摘したいもう1つの一般的な事実は、デフォルトでは、スレッドコンストラクターは渡されたすべての引数をコピーするということです。これは、引数が呼び出しスレッドよりも長く存続する必要がある可能性があるためです。引数をコピーすると保証されます。代わりに、本当に参照を渡したい場合は、std::reference_wrapper
created byを使用できますstd::ref
。
std::thread (foo, std::ref(arg1));
これを行うことにより、スレッドが引数を操作するときに引数が存在することを保証することを約束します。
上記のすべてのものをも適用することができるstd::async
とstd::bind
。