forksでithreadsに思いを馳せてみる

makamaka
2010-12-22

仕事でいっぱいいっぱいのmakamakaです。

Perlにはithreadsというスレッド機能がありますよね。みなさん使ってますか? 私は使ってません。ithreadsといえば、遅い・メモリ喰い・不安定とディスられまくりの可哀想な子。非同期処理がしたければCoroなどもありますし、使わない(使えない)ですよね。

そ・れ・で・も

「せっかくだから一度ぐらい使ってみたいなあ」と思う方もいるかもしれません。でもでも、使ってるPerlがスレッド無効でコンパイルしてあるので試せないよ、ithreadsごときに再コンパイルしたくないよ、という方もいるでしょう。そこで両者を同時に満たすためにforksを紹介します。

forksはthreads互換のAPIを提供します。ただしスレッドはforkを使って実現されます*1。スレッド間の通信(共有変数)はソケット通信。

use strict;
use forks;
use forks::shared;

my @threads;
my $count : shared; # 共有変数

for ( 1 .. 10 ) {
    push @threads, threads->new( sub {
        printf( "やあ、スレッド %d だよ\n", threads->tid );
        lock( $count ); # ロックしないと
        $count++;
    } );
}

$_->join for ( @threads ); # join join!

print $count, "\n"; # 10

たまたま出た結果:

やあ、スレッド 1 だよ
やあ、スレッド 2 だよ
やあ、スレッド 3 だよ
やあ、スレッド 4 だよ
やあ、スレッド 5 だよ
やあ、スレッド 6 だよ
やあ、スレッド 7 だよ
やあ、スレッド 8 だよ
やあ、スレッド 10 だよ
やあ、スレッド 9 だよ
10

という具合に、ithreadsの気分が味わえます。これを書いている時点で最新のforksはthreads 1.77相当です。

$ perl -Mforks -e 'print threads->VERSION'

ってやるとthreadsの互換バージョンがわかります。

あんまり役に立つネタじゃなくてごめんなさい。おまけとしてacmeトラックに補足記事を用意しました。ではさようなら。

さあ、明日はgfxさんです!

*1: Windowsには対応していません