ithreadsとithreads::shared

ithreadsはinterpreter threadsのことでPerl 5.6で導入された。当初はWindowsでfork()をサポートするために用意されたものだったが今では(Perl 5.8から?)

use threads;

ってすると使える。
これは従来のPerlのスレッドと違って、デフォルトではスレッド間でなにも共有しない。共有するためには

use threads::shared;

とする必要がある。
というわけで使ってみたんだけど、もはや何をしたかったのかすらよくわからない。

#!/usr/bin/perl

use strict;
use warnings;

use threads;
use threads::shared;

use Time::HiRes qw( usleep gettimeofday tv_interval );
use Data::Dumper;

# ---------------------------------------------------------------------------

my $num_of_threads = 10;

my %data : shared;
$data{counter} = 0;
# you must create nested shared data structures by first creating individual
# shared leaf nodes, and then adding them to a shared hash or array.
# http://perldoc.perl.org/threads/shared.html
$data{start} = &share([]);
@{ $data{start} } = gettimeofday();

foreach my $id ( 1..$num_of_threads ) {
    threads->create( 'on_init', $id );
}

sleep 1;

# ---------------------------------------------------------------------------

sub on_init {
    my $id = shift;

    usleep( rand(1000) );

    $data{counter}++;
    my $elapsed = tv_interval( $data{start} );

    print "$id : $data{counter} : $elapsed\n";
    #print Dumper(\%data);
}

# ---------------------------------------------------------------------------

1;

共有するときの注意点(見事にはまった)。

you must create nested shared data structures by first creating individual shared leaf nodes, and then adding them to a shared hash or array.
threads::shared - perldoc.perl.org

実行結果

2 : 1 : 0.048804
1 : 2 : 0.050278
3 : 3 : 0.076725
5 : 4 : 0.078049
4 : 5 : 0.079095
6 : 6 : 0.096007
7 : 7 : 0.100342
8 : 8 : 0.10169
9 : 9 : 0.105107
10 : 10 : 0.10636
    • -

threads - perldoc.perl.org