原です。 > まつもと ゆきひろです > それもそうですね.やはり難しい.こうしてみました. > > def pop non_block=FALSE > Thread.exclusive do > return @que.shift if @que.length > 0 > raise ThreadError, "queue empty" if non_block > @waiting.push Thread.current > end > Thread.stop > @que.shift > end ええと、Thread.stop と @que.shift の間で第三のスレッド が @que の中身をかすめとって空にしてしまう可能性もある ので、やっぱり loop させる必要があるのでは。 これでどうでしょうか。 def pop non_block=FALSE loop do Thread.exclusive do return @que.shift if @que.length > 0 raise ThreadError, "queue empty" if non_block @waiting.push Thread.current end Thread.stop end end > これでもpushからstopの間にrunされたらまずいんですけど…. この問題は難しいですね。Thread#status が、run, stop の情報 まで込めて返してくれればいいのかもしれない。 ---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=-- Shin-ichro Hara(Nagaoka Univ.of Tech.)