原です。

> まつもと ゆきひろです

> それもそうですね.やはり難しい.こうしてみました.
> 
>   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.)