『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』を読んだ。
Javaマルチスレッドはすごいと。Java見直した。がrubyもしゅごい
Single Threaded Execution - この橋を渡れるのは、たった一人 Immutable - 壊したくとも、壊せない Guarded Suspension - 用意できるまで、待っててね Balking - 必要なかったら、やめちゃおう Producer-Consumer - わたしが作り、あなたが使う Read-Write Lock - みんなで読むのはいいけれど、読んでる間は書いちゃだめ Thread-Per-Message - この仕事、やっといてね Worker Thread - 仕事が来るまで待ち、仕事が来たら働く Future - 引換券を、お先にどうぞ Two-Phase Termination - 後片付けしてから、おやすみなさい Thread-Specific Storage - スレッドごとのコインロッカー Active Object - 非同期メッセージを受け取る、能動的なオブジェクト まとめ - マルチスレッドプログラミングのパターン・ランゲージhttp://www.hyuki.com/dp/dp2.html
Rubyで解釈して、面倒だが、理解のため書き直していった。
添付ライブラリ
スレッドの作り方
継承
class MyThread < Thread end MyThread.new
スレッドセーフ
mutex
m = Mutex.new
m.synchronize{
}
スレッドのWait
1:threadパッケージ mutex, ConditionVariable
require 'thread' @m = Mutex.new @cv = ConditionVariable.new while ( self.ready? == false) do @cv.wait(@m) end
2:添付パッケージmonitorを使う
スレッドの同期機構としてのモニター機能を提供するクラスです。 また同じスレッドから何度も lock できる Mutex としての機能も提供します。
require 'monitor' buf = [] mon = Monitor.new empty_cond = mon.new_cond # consumer Thread.start do loop do buf.synchronize do empty_cond.wait_while { buf.empty? } #ここでWait。Rubyらしい書き方で良い感じ。 print buf.shift end end end # producer while line = ARGF.gets buf.synchronize do buf.push(line) empty_cond.signal #ここでnotify end endhttp://www.ruby-lang.org/ja/man/html/Monitor.html
かならずjoinする。
mainスレッドが終了すると、他のスレッドも終了するので、メインスレッドは他のスレッドを待つようにすること。
2010-11-25 追記
エントリ
デザインパターンをRubyで書き直した実例
Rubyでマルチスレッド 14 #ActiveObject - それマグで!
Rubyでマルチスレッド 13 #thread specific Storage - それマグで!
Rubyでマルチスレッド 12 #two-phase termination - それマグで!
Rubyでマルチスレッド 11 #Future - それマグで!
Rubyでマルチスレッド 10 # Worker-Thread - それマグで!
Rubyでマルチスレッド その8 # Thread per Message - それマグで!
Rubyでマルチスレッド その8 # Read-Write Lock - それマグで!
Rubyでマルチスレッド その7# Producer-and-Consumer - それマグで!
Rubyでマルチスレッド その6 # Balking - それマグで!
Rubyでマルチスレッド その5 # Guarded Suspension - それマグで!
Rubyでマルチスレッドその4 Immutable - それマグで!
Rubyでマルチスレッドその3 Single Thread Execution - それマグで!
Rubyマルチスレッドその1 - それマグで!
自己流に解釈していく経過で理解が深まったと思う。
最後に
@hyuki先生。とっても丁寧でポイントが分かりやすい解説でした。Rubyで書くときに「まとめ」がとても参考になりました。ありがとうございます。数学ガール・乱択アルゴリズム楽しみにしています。
*1:joinしないスレッド例外の場合