- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{category Perl}}
*fork()による疑似マルチスレッド
Perlでマルチスレッドプログラムを作成するには、ithreadsを使う方法もあるが、スレッド間通信の必要が無い場合にはより多くの環境で利用可能なfork()を用いて疑似マルチスレッド(マルチプロセス)プログラムを作成することも可能である。スレッド(プロセス)間での通信を要する場合には通常のithreadsを使うか、fork()でthreadをエミュレートする[forks|http://search.cpan.org/dist/forks/lib/forks.pm]を用いるか、一時ファイルを介したやりとりをするように実装するとよいでしょう。
Perlでマルチスレッドプログラムを作成するには、ithreadsを使う方法もあるが、スレッド間通信の必要が無い場合にはより多くの環境で利用可能なfork()を用いて疑似マルチスレッド(マルチプロセス)プログラムを作成することも可能である。スレッド(プロセス)間での通信を要する場合には通常のithreadsを使うか、fork()でthreadをエミュレートする[forks|http://search.cpan.org/dist/forks/lib/forks.pm]を用いるか、一時ファイル・パイプ・ソケットを介したやりとりをするように実装するとよいでしょう。IPC::なんとかというモジュールも各種ありますのでCPANで検索してみるとよいでしょう。個人的には[IPC::Lite|http://search.cpan.org/~earonesty/IPC-Lite-0.1.28/IPC/Lite.pm]なんかがシンプルでよさげに思います。
*コード例
use strict;
$| = 1;
my $numthreads = 2;
{
my $child = 0;
$? = 0;
for (my $i = 0; $i < 100; $i ++) {
if (my $pid = fork()) {
$child ++;
if ($child == $numthreads) {
if (wait == -1) {
$child = 0;
} else {
$child --;
}
}
if ($?) {
&errorMessage(__LINE__);
}
next;
}
else {
print($i + 1 . "\n");
exit(0);
}
}
}
# join
while (wait != -1) {
if ($?) {
&errorMessage(__LINE__);
}
}