Encodeモジュールはスレッドセーフではない、ってどこかに書いてあって、
find_encodingで得られるオブジェクトを使いまわしてる身としては気になったので。
(スレッド間で使いまわすことはないんだけど。)
適当にスレッド作ってループ回してみたけども、
スレッドセーフになるようになってる模様?
あと、shared_cloneしないほうが数倍近く早く終わる。
コード間違ってたら恥ずかしい
# SJISで書きました use strict; use threads; use threads::shared; use Encode; my $sjisenc = shared_clone(find_encoding('sjis')); my $utf8enc = shared_clone(find_encoding('utf-8')); #my $sjisenc = (find_encoding('sjis')); #my $utf8enc = (find_encoding('utf-8')); my @list; push @list, new threads(\&f); push @list, new threads(\&f); push @list, new threads(\&f); push @list, new threads(\&f); push @list, new threads(\&f); $_->join for (@list); sub f{ print "ID ". threads->tid . " start.\n"; for(1..100_000){ encode_test(); } print "ID ". threads->tid . " end.\n"; } sub encode_test{ my $sjis_string = "あいうえお"; my $flagged_utf8_string = $sjisenc->decode($sjis_string); my $utf8_string = $utf8enc->encode($flagged_utf8_string); my $answer = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A"; # utf8の"あいうえお" $utf8_string eq $answer || die; }