原です。 > まつもと ゆきひろです. > |(1) > 共有するデータの変更は基本的にMutexで保護する必要があります. > 参照するだけなら必要ないです.しかし,実はrubyのthreadはかな > りnon-preemptiveなところがあるので, > # つまり安全なタイミングでしか切替えが起きない > > | v.push "abc" > | > |はどうでしょう? > | > | v["ABC"] = "abc" > | > |は? > > はちゃんと動く可能性があります.でも,保護しておいた方が安全 > でしょう.将来のrubyがちゃんとしたthreadを使うようにならない > と言う保証は無いですから. わかりました。実は上の2つは結構ちゃんと動いているみたいなので、 質問しました。 > |(2)Thread: deadlock 、、、とかいうメッセージを出してプログラム > |が停止することがありますが、このメッセージが出れば必ず ruby のバ > |グといえますか?それともこちらのプログラムのアルゴリズムに検討す > |べきところがあるのでしょうか? > > rubyのバグでなければdeadlockが起きています.たとえばthreadが > お互いの終了を待ってブロックしてしまったりするとdeadlockにな > ります. そうなんですか、そういうチェックが入っているんですね。 ときどき deadlock を起こすこちらのプログラムは、複数のスレッドが 互いに「ただ一つのみの Mutex オブジェクトを、synchronize をのみ を使ってブロックする」だけなのですが、この条件で deadlock を起こ す可能性は無いと思うのですが、勘違いかな。 とここまで書いて気がついたけどつぎのスクリプトで deadlock が 作れますね。 ----^ deadlock_test.rb #!/usr/local/bin/ruby require "thread" m = Mutex.new Thread.start { m.synchronize { m.synchronize { } } } m.synchronize { m.synchronize { } } ----$ deadlock_test.rb synchronize のネストがないかどうか、自分のスクリプトを点検してみ ることにします。^^; とろこで、つぎのスクリプトでは deadlock エラーが起こらずプログラ ムが停止します。 ----^ deadlock_test1.rb #!/usr/local/bin/ruby require "thread" m = Mutex.new m.synchronize { m.synchronize { } } ----$ deadlock_test1.rb 自分のスレッドでかけたロックにチェック機構が働いてないので しょうか? 次の例では Segmentation falut で落ちます。 ----^ deadlock_test2.rb #!/usr/local/bin/ruby require "thread" m = Mutex.new Thread.start { m.synchronize { m.synchronize { } } } sleep 1 ----$ deadlock_test2.rb どれも linxu 1.2.13 ELF で、です。 ---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=-- Shin-ichro Hara(Nagaoka Univ.of Tech.)