トップ 一覧 Farm 検索 ヘルプ RSS ログイン

fork()による疑似マルチスレッドの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{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__);
 	}
 }