Kentaro Shirakata
argra****@users*****
2007年 8月 4日 (土) 02:17:01 JST
Index: docs/perl/5.8.4/threads.pod diff -u /dev/null docs/perl/5.8.4/threads.pod:1.1 --- /dev/null Sat Aug 4 02:17:01 2007 +++ docs/perl/5.8.4/threads.pod Sat Aug 4 02:17:01 2007 @@ -0,0 +1,446 @@ + +=encoding euc-jp + +=head1 名前 + +threads - インタプリタスレッドの使用を可能にするPerl拡張 + +=head1 概要 + + use threads; + + sub start_thread { + print "Thread started\n"; + } + + my $thread = threads->create("start_thread","argument"); + my $thread2 = $thread->create(sub { print "I am a thread"},"argument"); + my $thread3 = async { foreach (@files) { ... } }; + + $thread->join(); + $thread->detach(); + + $thread = threads->self(); + $thread = threads->object( $tid ); + + $thread->tid(); + threads->tid(); + threads->self->tid(); + + threads->yield(); + + threads->list(); + +=head1 説明 + +=begin original + +Perl 5.6 introduced something called interpreter threads. Interpreter +threads are different from "5005threads" (the thread model of Perl +5.005) by creating a new perl interpreter per thread and not sharing +any data or state between threads by default. + +=end original + +Perl 5.6 はインタプリタスレッドと呼ばれるものを導入した。 +インタプリタスレッドは、スレッド毎に新たにPerlインタプリタを +生成することによって、また、デフォルトではいかなるデータや状態も +スレッド間で共有しないことによって、"5005スレッド" +(Perl 5.005 におけるスレッドモデル)とは区別される。 + +=begin original + +Prior to perl 5.8 this has only been available to people embedding +perl and for emulating fork() on windows. + +=end original + +perl 5.8より前では、これはperlをembedする人々にとってのみ、 +そしてwindowsでfork()をエミュレートするためにのみ利用可能であった。 + +=begin original + +The threads API is loosely based on the old Thread.pm API. It is very +important to note that variables are not shared between threads, all +variables are per default thread local. To use shared variables one +must use threads::shared. + +=end original + +threads APIは、いい加減な形で古いThread.pm APIに基づいている。 +変数はスレッド間で共有されず、全ての変数はデフォルトで +スレッドローカルなものであることに注意しておくことが非常に重要だ。 +共有変数を利用するには、threads::sharedを使わなければならない。 + +=begin original + +It is also important to note that you must enable threads by doing +C<use threads> as early as possible in the script itself and that it +is not possible to enable threading inside an C<eval "">, C<do>, +C<require>, or C<use>. In particular, if you are intending to share +variables with threads::shared, you must C<use threads> before you +C<use threads::shared> and C<threads> will emit a warning if you do +it the other way around. + +=end original + +また、スクリプト内ではできるだけ早いうちにC<use threads>して +スレッドを利用可能にしておくべきだし、 +C<eval "">, C<do>, C<require>, C<use>の内部では +スレッド操作ができないことに注意すること。 +特にthreads::sharedを使って変数を共有しようとするならば、 +C<use threads::shared>の前にC<use threads>しなければならない。 +逆にしてしまうとC<threads>は警告を発する。 + +=over + +=item $thread = threads->create(function, LIST) + +=begin original + +This will create a new thread with the entry point function and give +it LIST as parameters. It will return the corresponding threads +object. The new() method is an alias for create(). + +=end original + +これはエントリーポイントとなる関数を伴って新しいスレッドを生成し、 +リストをパラメータとして与える。対応するスレッドオブジェクトを返す。 +new()はcreate()の別名だ。 + +=item $thread->join + +=begin original + +This will wait for the corresponding thread to join. When the thread +finishes, join() will return the return values of the entry point +function. If the thread has been detached, an error will be thrown. + +=end original + +対応するスレッドがjoinするのを待つ。そのスレッドが終了した時、join()は +エントリーポイント関数の戻り値を返す。もしそのスレッドがdetachされていたなら、 +エラーが投げられる。 + +=begin original + +The context (scalar or list) of the thread creation is also the +context for join(). This means that if you intend to return an array +from a thread, you must use C<my ($thread) = threads->new(...)>, and +that if you intend to return a scalar, you must use C<my $thread = ...>. + +=end original + +スレッド生成時のコンテキスト(スカラーないしはリスト)は、join()の +コンテキストでもある。この意味するところは、あなたがスレッドから配列を +返したいと思うなら、C<my ($thread) = threads->new(...)>としなければならず、 +スカラーを返して欲しくばC<my $thread = ...>としなければならないということだ。 + +=begin original + +If the program exits without all other threads having been either +joined or detached, then a warning will be issued. (A program exits +either because one of its threads explicitly calls exit(), or in the +case of the main thread, reaches the end of the main program file.) + +=end original + +いずれかのスレッドがjoinかdetachされずにプログラムが終了すると、警告が +出る(スレッドの一つが明示的にexit()を呼び出すか、あるいはメインスレッドの +場合ならメインのプログラムファイルの終端に達した時のいずれかによって +プログラムは終了する)。 + + +=item $thread->detach + +=begin original + +Will make the thread unjoinable, and cause any eventual return value +to be discarded. + +=end original + +そのスレッドをjoin不可能にし、結果の戻り値を破棄する。 + +=item threads->self + +=begin original + +This will return the thread object for the current thread. + +=end original + +現在のスレッドのスレッドオブジェクトを返す。 + +=item $thread->tid + +=begin original + +This will return the id of the thread. Thread IDs are integers, with +the main thread in a program being 0. Currently Perl assigns a unique +tid to every thread ever created in your program, assigning the first +thread to be created a tid of 1, and increasing the tid by 1 for each +new thread that's created. + +=end original + +スレッドのidを返す。スレッドIDは整数であり、プログラムの始まりとなる +メインスレッドの値は0である。現在のPerlは、生成された最初のスレッドの +tidに1を与え、新しいスレッドが生成されるたびにtidの値を1増やしていくことに +よって、プログラム中に生成される全てのスレッドに一意なtidを割り振る。 + +=begin original + +NB the class method C<< threads->tid() >> is a quick way to get the +current thread id if you don't have your thread object handy. + +=end original + +注意 あなたがスレッドオブジェクトを利用できない場合、クラスメソッド +C<< threads->tid() >>は、現在のスレッドidを手にする近道である。 + +=item threads->object( tid ) + +=begin original + +This will return the thread object for the thread associated with the +specified tid. Returns undef if there is no thread associated with the tid +or no tid is specified or the specified tid is undef. + +=end original + +指定されたtidに関連するスレッドのオブジェクトを返す。もしそのtidと関連する +スレッドがない場合、あるいはtidが指定されていない、指定されたtidがundefの +場合、メソッドはundefを返す。 + +=item threads->yield(); + +=begin original + +This is a suggestion to the OS to let this thread yield CPU time to other +threads. What actually happens is highly dependent upon the underlying +thread implementation. + +=end original + +このスレッドが他のスレッドにCPU時間を譲ってもいいということをOSに示唆する。 +実際に起こることは、基になっているスレッド実装に大きく依存している。 + +=begin original + +You may do C<use threads qw(yield)> then use just a bare C<yield> in your +code. + +=end original + +コード内では、C<use threads qw(yield)>してから、たんに裸のC<yield>を +使ってもよい。 + +=item threads->list(); + +=begin original + +This will return a list of all non joined, non detached threads. + +=end original + +joinおよびdetachされていない全てのスレッドのリストを返す。 + +=item async BLOCK; + +=begin original + +C<async> creates a thread to execute the block immediately following +it. This block is treated as an anonymous sub, and so must have a +semi-colon after the closing brace. Like C<< threads->new >>, C<async> +returns a thread object. + +=end original + +C<async>はその直後に続くブロックを実行するスレッドを生成する。 +このブロックは無名サブルーチンとして扱われるので、閉じ大括弧の後に +セミコロンをつけなければならない。C<< threads->new >>同様、C<async>は +スレッドオブジェクトを返す。 + +=back + +=head1 WARNINGS + +(警告) + +=over 4 + +=item A thread exited while %d other threads were still running + +=begin original + +A thread (not necessarily the main thread) exited while there were +still other threads running. Usually it's a good idea to first collect +the return values of the created threads by joining them, and only then +exit from the main thread. + +=end original + +あるスレッド(メインスレッドである必要はない)が、まだ他のスレッドが +実行中にexitした。通常、はじめに生成されたスレッドの戻り値を +joinでもって回収し、それからメインスレッドからexitするのがよい方法だ。 + +=back + +=head1 TODO + +=begin original + +The current implementation of threads has been an attempt to get +a correct threading system working that could be built on, +and optimized, in newer versions of perl. + +=end original + +現在のスレッド実装は、より新しいPerlのバージョンにおいて、 +正しく動作するスレッドシステムとして構築され、最適化されてきた。 + +=begin original + +Currently the overhead of creating a thread is rather large, +also the cost of returning values can be large. These are areas +were there most likely will be work done to optimize what data +that needs to be cloned. + +=end original + +現在のところ、スレッドの生成にかかるオーバーヘッドはやや大きく、 +また、値を返すためのコストも大きくなりかねない。クローンされる +必要のあるデータが何なのかを最適化する余地があるだろう。 + +=head1 BUGS + +(バグ) + +=over + +=item Parent-Child threads. + +(親-子スレッド) + +=begin original + +On some platforms it might not be possible to destroy "parent" +threads while there are still existing child "threads". + +=end original + +プラットフォームによっては、子スレッドがまだ存在している間は +親スレッドを破壊することができないことがある。 + +=begin original + +This will possibly be fixed in later versions of perl. + +=end original + +たぶん今後のperlのバージョンではフィックスされるだろう。 + +=item tid is I32 + +(tidはI32) + +=begin original + +The thread id is a 32 bit integer, it can potentially overflow. +This might be fixed in a later version of perl. + +=end original + +スレッドidは32bit整数である。オーバーフローする可能性がある。 +今後のperlのバージョンではフィックスされるだろう。 + +=item Returning objects + +(オブジェクトが返る場合) + +=begin original + +When you return an object the entire stash that the object is blessed +as well. This will lead to a large memory usage. The ideal situation +would be to detect the original stash if it existed. + +=end original + +オブジェクトを返すとき、そのオブジェクトがblessされているstashも +同様に返す。これはメモリを大量に使用するかもしれない。理想的な状態は、 +存在しているならオリジナルのstashを見つけ出すことなのだが。 + +=item Creating threads inside BEGIN blocks + +(BEGIN ブロック内部でのスレッドの作成) + +=begin original + +Creating threads inside BEGIN blocks (or during the compilation phase +in general) does not work. (In Windows, trying to use fork() inside +BEGIN blocks is an equally losing proposition, since it has been +implemented in very much the same way as threads.) + +=end original + +BEGINブロック内で(つまり一般的にコンパイルフェーズの段階で) +スレッドを生成することはできない(WindowsのBEGINブロック内でfork() +を利用しようとする試みも同様に見込みのない提案である。なぜなら +スレッドと全く同じ方法で実装されてきたからだ)。 + +=item PERL_OLD_SIGNALS are not threadsafe, will not be. + +(PERL_OLD_SIGNALSはスレッドセーフではないし、なることもない。) + +=begin original + +If your Perl has been built with PERL_OLD_SIGNALS (one has +to explicitly add that symbol to ccflags, see C<perl -V>), +signal handling is not threadsafe. + +=end original + +もしあなたがPERL_OLD_SIGNALSオプションを有効にして +(このシンボルをccflagに明示的に追加しなければならない。C<perl -V>を見よ) +Perlをビルドしているなら、 +シグナルの扱いはスレッドセーフではない。 + +=back + +=head1 AUTHOR and COPYRIGHT + +(著者および著作権) + +Arthur Bergman E<lt>sky****@nanis*****<gt> + +threads is released under the same license as Perl. + +Thanks to + +Richard Soderberg E<lt>perl****@cryst*****<gt> +Helping me out tons, trying to find reasons for races and other weird bugs! + +Simon Cozens E<lt>simon****@breco*****<gt> +Being there to answer zillions of annoying questions + +Rocco Caputo E<lt>troc****@netru*****<gt> + +Vipul Ved Prakash E<lt>mail****@vipul*****<gt> +Helping with debugging. + +please join perl-****@perl***** for more information + +=head1 SEE ALSO + +L<threads::shared>, L<perlthrtut>, +L<http://www.perl.com/pub/a/2002/06/11/threads.html>, +L<perlcall>, L<perlembed>, L<perlguts> + +=begin meta + +Translate: まかまか <makam****@donzo*****> +Update: Kentaro Shirakata <argra****@ub32*****> + +=end meta +