スレッドの生成
perlでスレッドを使用する時は、Threadモジュールを使用します。
スレッド生成の記述は二つあります。
use strict; use warnings; use Thread; my $something; my $t = Thread->new( sub { say ($something) } );
use strict; use warnings; use Thread qw(async); my $something; my $t = async { say($something); };
スレッドの破棄
生成したスレッドは、与えられた処理を実行します。
スレッドを生成したら、そのスレッド処理が終了するまで、プロセスを終了しないようにしなければなりません。
スレッドの実行が終わるまでは「joinメソッド」を呼び出して待機します。
use strict; use warnings; use Thread qw(async); my $t = async { my $sum = 0; for my $d (1..10) { $sum += $d; } return $sum; }; print $t->join(), "\n";
$t->joinの部分は、スレッド処理が終わるまで待機している部分です。
上記のようにスレッド処理の返り値を受け取ることもできます。
スレッドからなにも受け取らない場合は、代わりに「$t->detach()」を読んでもいいかもしれません。スレッドの後始末はPerlが行なってくれるようになります。
マルチスレッドの実行テスト
マルチスレッドのプログラム例を下記のように作成しました。
use strict; use warnings; use Thread; sub cal_sum { my $tid = shift; my $sum = 0; for my $d (0..10) { sleep(rand(3)); print "$tid: add $d\n"; $sum += $d; } return $sum; } my $t1 = Thread->new(\&cal_sum, 1); my $t2 = Thread->new(\&cal_sum, 2); $_->join() for($t1, $t2);
表示結果は下記のようになりました。
1: add 0
1: add 1
2: add 0
1: add 2
1: add 3
1: add 4
2: add 1
1: add 5
1: add 6
2: add 2
2: add 3
1: add 7
2: add 4
1: add 8
2: add 5
2: add 6
1: add 9
1: add 10
2: add 7
2: add 8
2: add 9
2: add 10