Perlでマルチスレッド

2008/10/28

Rubyでマルチスレッドを書くときはとても直感的なのですが、そういえばPerlでマルチスレッドはどう書くんだっけ? と思い、書いてみました。
use threads;

my $thr1 = threads->new(\&thr_sub, 1);  # スレッド1で関数実行
my $thr2 = threads->new(\&thr_sub, 2);  # スレッド2で関数実行

thr_sub(3);				# 主スレッドで関数実行

$thr1->join;                            # スレッド1の終了待ち
$thr2->join;                            # スレッド2の終了待ち

sub thr_sub
{
  my ($param) = @_;
  for (1..5)
  {
    print "thread $param ($_)\n";
    threads->yield();                   # CPUを他のスレッドに明け渡す
    sleep 1;
  }
}

この処理を実行すると各々のスレッドが独立して動作するので結果は以下のようになります。割と直感的でした。

thread 1 (1)
thread 2 (1)
thread 3 (1)
thread 2 (2)
thread 1 (2)
thread 3 (2)
thread 1 (3)
thread 3 (3)
thread 2 (3)
thread 1 (4)
thread 2 (4)
thread 3 (4)
thread 1 (5)
thread 2 (5)
thread 3 (5)