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
-
- -