読者です 読者をやめる 読者になる 読者になる

Perlによるスレッドプログラミングメモ

thread perl

スレッドの生成


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