まつもと ゆきひろです.

In message "[ruby-list:1667] [Q] Use of Thread and Mutex"
    on 97/01/10, sinara / blade.nagaokaut.ac.jp <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を使えば可能ですけど,今度は他の部分の効率が
下がりすぎるし….
                                まつもと ゆきひろ /:|)