2018年06月15日
《その403》thread の引数としての 関数およびラムダ式
thread の引数としての 関数およびラムダ式
下記のプログラムにおいて、
★1. スレッド th1 の受け取る引数は func, a, n の3つです。
この場合、func が関数なので、 func, a, n の並びは func(a, n) と同じ効果をもちます。
★2. スレッド th2 の受け取る引数は ラムダ式です。
キャプチャリスト [ ]内に b, n を指定しています。
※外部の変数 b, n のコピーが作られ、ラムダ式の内部で使えるようになります。
ラムダ式
ラムダ式は、基本的には、
[キャプチャリスト](パラメータリスト){ 関数本体 }()
の形をしています。
このうち、パラメータリストは省略が可能です。
また、最後の () はこのラムダ式の呼び出しです。その場でラムダ式を実行させたいときに記述し、パラメータリストに渡す引数を この中に記入できます。
下記のプログラムの最後に、参考用のラムダ式
[&a, &b, &c](int k) {
cout << (a + b + c) * k << '\n';
}(10);
を加えてあります。
キャプチャリストが &a, &b, &c となっているので、各変数のコピーではなく、変数 a, b, c を参照してラムダ式内部で利用します。
ラムダ式は、引数 10 で呼び出されますから、これを k が受け取って処理が行われます。
以下はプログラムです。
#include <iostream>
#include <thread>
#include <string>
using namespace std;
void func(int a, int n) {
for (int i = 0; i < n; i++)
cout << to_string(a + i) + ' ';
}
int main() {
int a = 10;
int b = 20;
int c = 30;
int n = 4;
// 6回繰り返します。
int loop = 6; while (loop--) {
// ★1. 整数 10, 11, 12, 13 を順に出力します。
thread th1 = thread(func, a, n);
// ★2. 整数 20, 21, 22, 23 を順に出力します。
thread th2 = thread([b, n]() {
for (int i = 0; i < n; i++)
cout << to_string(b + i) + ' ';
});
// ★3. 整数 30, 31, 32, 33 を順に出力します。
for (int i = 0; i < n; i++) {
cout << to_string(c + i) + ' ';
}
th1.join();
th2.join();
cout << '\n';
}
// 参考用のラムダ式
[&a, &b, &c](int k) {
cout << (a + b + c) * k << '\n';
}(10);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7780417
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック