TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

C++でメンバ関数をスレッドで実行する

C++で静的メンバ関数をスレッドで実行するには、以下のように記述する。

class A {
public:
	static void f() {};
};
int main()
{
	thread th(A::f);
	th.join();

	return 0;
}

では、メンバ関数をスレッドで実行するにはどうすればよいだろうか。

class A {
public:
	void f() {};
};
int main()
{
	A a;

	thread th(a.f);
	th.join();

	return 0;
}

このように書くとエラーになる。

	thread th(&a.f);

このように書いてもエラーになる。

thisポインタを引数にする方法

マルチスレッドでクラスのメンバ関数を実行する場合(C++11 std::thread) - Programming Serendipity
この記事によると、引数にthisポインタを渡すことで呼び出せるようだ。

	thread th(&A::f, &a);

このような書き方が可能だ。

なんか処理系依存な気がするが、規格書にある方法らしい。
規格書で読むC++11のスレッド
(p.22)

ラムダ式を使う方法

ラムダ式を使えば、もう少し標準的な書き方ができる。

	thread th([&a]() { a.f(); });

こちらの書き方の方がよいと思う。

クラスのメンバ関数内で別のメンバ関数をスレッドで実行するには、

class A {
public:
	void f() {}
	void Run() {
		thread th([this]() { this->f(); });
		th.join();
	}
};

このように書ける。