From: matz@... (Yukihiro Matsumoto) Date: 1997-01-10T14:41:17+09:00 Subject: [ruby-list:1668] Re: [Q] Use of Thread and Mutex まつもと ゆきひろです. In message "[ruby-list:1667] [Q] Use of Thread and Mutex" on 97/01/10, sinara@blade.nagaokaut.ac.jp writes: | |原です。 | |(1)Mutex に関しての質問です。チュートリアルには共有するデータ |の保護の例として | | m.synchronize { | v = v + 100 | } | |というのがあがっていますが、他にこの様に保護しないといけない演算は |どういうものがありますか? 共有するデータの変更は基本的にMutexで保護する必要があります. 参照するだけなら必要ないです.しかし,実はrubyのthreadはかな りnon-preemptiveなところがあるので, # つまり安全なタイミングでしか切替えが起きない | v.push "abc" | |はどうでしょう? | | v["ABC"] = "abc" | |は? はちゃんと動く可能性があります.でも,保護しておいた方が安全 でしょう.将来のrubyがちゃんとしたthreadを使うようにならない と言う保証は無いですから. |(2)Thread: deadlock 、、、とかいうメッセージを出してプログラム |が停止することがありますが、このメッセージが出れば必ず ruby のバ |グといえますか?それともこちらのプログラムのアルゴリズムに検討す |べきところがあるのでしょうか? rubyのバグでなければdeadlockが起きています.たとえばthreadが お互いの終了を待ってブロックしてしまったりするとdeadlockにな ります. |(3)あるスレッドが TCPsocket.open でブロックしているときに、 |他のスレッドが全て止まる様にみえるのですが、これは仕様ですか? |(それとも私の勘違いかも。)これを回避する方法はありますか? あー,socketのthread対応が不完全であることは十分考えられます が,TCPsocket.openってブロックしましたっけ? ブロックするのは acceptだけだと思っていたのですけど. もしかしてconnect(2)がtimeoutするまでのことを言っているのか な? だとするとこれは(仕様ではないにしても)対応は難しいですね え.ITIMER_REALを使えば可能ですけど,今度は他の部分の効率が 下がりすぎるし…. まつもと ゆきひろ /:|)