自己紹介:
自己紹介:
名前:まかまか(略
主にPerlがらみのお仕
事が多い職場です
未来ある若手
エンジニアの
海外研修
募集中:
Perl, Pythonなどのプログ
ラミング、PostgreSQLな
どのDB運用、業務システム
企画・構築などに興味のある
方(バイト、非常勤など)
自分のこれまでのPerlと
の関わりを振り返って
自分のこれまでのPerlと
の関わりを振り返って
あんまり試行錯誤しない
で適当に生きてきたわー
試行錯誤というか、どうい
うときにどういうモノで学
んできたかについて
リファレンスと正規表現の勉強
仕事始めてからは
クックブックが大変重宝しました
オブジェクト指向は
ネットワーク関連は
最初のOSS的な活動
最初のOSS的な活動
perldoc.jp(ドキュメント翻訳)への参加
Games::系やMIDIなど Parse::RecDescent ithreads関連
ドキュメント翻訳作業は良い ・読む力がつく
ドキュメント翻訳作業は良い ・読む力がつく
Parse::RecDescent
ithreads関連
最初のモジュール公開
最初のモジュール公開
JEncode.pm
最初のモジュール公開
JEncode.pm
……JcodeのEncode実装 かのUTF8フラグと向き合う
最初のモジュール公開
JEncode.pm
……JcodeのEncode実装 かのUTF8フラグと向き合う Devel::Peek大事
$ perl -MDevel::Peek -e"use utf8; Dump('あ')" SV = PV(0xa72d898) at 0xa741f98 REFCNT = 1 FLAGS = (POK,READONLY,pPOK,UTF8) PV = 0xa755230 "¥343¥201¥202"¥0 [UTF8 "¥x{3042}"] CUR = 3 LEN = 8
初めてのCPANモジュール
初めてのCPANモジュール
JSON.pm
……decode部分は
初めてのCPANモジュール
JSON.pm
初めてのCPANモジュール
JSON.pm
……JSON::XSにあわせる ために再度UTF8フラグと向き 合う
初めてのCPANモジュール JSON.pm ……JSON::XSにあわせる ために再度UTF8フラグと向き 合う →ちゃんと理解してなかった
再度各種ドキュメントを読み直す ……
perlunicode, perlunitut, perluniintro, Encode,
というわけで、今更誰も
知りたくない最高に
PerlにはCoolな
ithreads(iスレッド)とい
う機能がある
PerlにはCoolな
ithreads(iスレッド)とい
う機能がある
use threads;
my $thr = threads->create(¥&foo); print "main thread¥n";
sub foo {
sprint("Foo! in thr(tid=%d)¥n", threads->tid); }
use threads;
my $thr = threads->create(¥&foo); print "main thread¥n";
sub foo {
sprint("Foo! in thr(tid=%d)¥n", threads->tid); }
元々はWindows版Perlでforkをエミュ レートするためのもの(Win32 Thread)
それが逆輸入されpthreadで実装された
※5.5時代はThreadというモジュールが あった(5005threads)。
threads->new(¥&foo) すると pthread_createされて&fooを 実行するperlインタプリタが生成 される。
threads->new(¥&foo) すると pthread_createされて&fooを 実行するperlインタプリタが生成 される。 そして親スレッドの一切合財(シン ボルテーブル、変数、ファイル)が 子スレッドにコピーされる……
threads->new(¥&foo) すると pthread_createされて&fooを 実行するperlインタプリタが生成 される。 そして親スレッドの一切合財(シン ボルテーブル、変数、ファイル)が 子スレッドにコピーされる……
my $hoge;
threads->create(sub{ })->join;
大抵のスレッドの売り「軽い」 iスレッドの売り「重い」
大抵のスレッドの売り「軽い」 iスレッドの売り「重い」
Tips:
何もuseしてない、変数宣言し てない段階で必要なだけ予め スレッドを生成しておくとよい よ!
コピーなので、変数がスレッド 間で共有されることもない
コピーなので、変数がスレッド 間で共有されることもない
既存のコードも安心だぜ! ※個人の感想です。
ちなみにblessされた変数があ れば子スレッドの数だけ
ちなみにXSモジュール内部の 変数とかはコピーされない。
CLONEサブルーチン使う。 sub CLONE { }
では変数の共有は?
use threads;
use threads::shared;
my $foo : shared = 1; my $bar;
shareされた変数は裏ではtie され、「共有変数用スレッド」に リンクされる。
shareされた変数は裏ではtie され、「共有変数用スレッド」に リンクされる。 STOREやFETCHを通じてデ ータがやり取りされる! →遅い!
共有変数用スレッド
スレッドA スレッドB
$foo = 1
say $foo $foo
shareされた変数は裏ではtie され、「共有変数用スレッド」に リンクされる。
tieされるので既存のtie変数 に対しては共有化できない
スレッドのコンテキスト
new (create) した時のコン テキストがjoin時のコンテキス トになる。
use threads;
my $th1 = threads->new( sub{return 1,3,5;} ); say $th1->join; # 5 を表示(スカラーコンテキストだから)
my ($th2) = threads->new( sub{return 1,3,5;} ); say $th2->join; # 135 を表示(リストコンテキストだから)
なお、初期の頃はthreadsに is_joinable とか
私の初めてのXSモジュールは Thread::State
use threads; use Thread::State; my $thr = threads->new(sub { ... }); while ( $thr->is_running ) {...} if( $thr->wantarray ){ ...} if ($thr->is_joined) { ... } if ($thr->is_joinable) { ...}
その他昔の色々は下記サイト にあるよ。
お家に帰ったら早速試してみた くなったでしょ?
お家に帰ったら早速試してみた くなったでしょ?
useithreadオプションつけて コンパイルしてみてね!
公式にithreadsの利用は