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.