In message <200006151134.UAA73885 / mail3.os.xaxon.ne.jp>
kjana / os.xaxon.ne.jp writes:

> ちなみにこの例の場合,上記のブロック内で新たに導入されたローカル変数は
> ブロックローカル,というルールにより,s はスレッドローカルになります.
> だからそもそもここで相互排除を行う必要は無かったりして.
> 
> # ....ですよね? 親スレッドが accept したせいで ns のアクセスが競合するっ
> # ていう事は無かったですよね?

訂正.やっぱり race condition になりそうですね.
    
        :
        |
    Socket#accept
        |
    Thread.new----------------+
        |                     |
    Socket#accept <-------> s = ns <- ここで
        |
        :

s は確かにスレッドローカルだけど ns が accept で書き換えられる可能性が
ある.ということで確かに Mutex による相互排除あたりはあった方が良いの
かも.....それなら accept も lock/unlock で括らなきゃだめか.

# for ループの場合と本質は同じなんだからすぐ気付け,という話あり.いい
# 加減な事書き散らしてるといかんな.


accept したソケットを Queue に放りこんでおいた方がスマートかな? 相互排
除を明示する必要無くなるうえに,ロジックはシンプルだ.

    AcceptedSocket = Queue.new
        :
    AcceptedSocket.push(gs.accept)
    Thread.new do
      s = AcceptedSocket.pop
        :
    end

....ちょっと無駄っぽいけど.うーん,ちゃんと Queue 中のソケットが全部
処理スレッドに渡るかどうか自信無い.穴があるような,無いような.

 
> さらに下の gets して write,っていう動作の方でも,s にアクセスできるの
> は s をもってるスレッドだけなので,やっぱり相互排除はいりません.

こっちは間違いないんですけど.

# わざわざ親スレッドで ns をアクセスしない限り.


-- 
柳川和久 @ 東大阪市 . 大阪府                                  June 17, 2000
What can't be seen is what can't be there.