From: Tanaka Akira Date: 2002-05-30T10:15:11+09:00 Subject: [ruby-dev:17223] race condition on Queue#pop? $B$J$s$H$J$/(B thread.rb $B$rD/$a$F$$$F!"(BQueue#pop $B$K(B race condition $B$,$"$k(B $B$N$G$O$J$$$+$H$$$&5$$,$7$F$-$^$7$?!#(B Queue#pop $B$O(B def pop(non_block=false) Thread.critical = true begin loop do if @que.empty? if non_block raise ThreadError, "queue empty" end @waiting.push Thread.current Thread.stop else return @que.shift end end ensure Thread.critical = false end end $B$H$$$&%3!<%I$G!"$"$k%9%l%C%I(B A $B$,(B pop $B$r8F$S=P$7!":G=i$K(B @que $B$,6u$@$C(B $B$?>l9g!"$$$C$?$s(B Thread.stop $B$G;_$^$k$o$1$G$9$,!"(B($BB>$N%9%l%C%I(B B $B$,(B Queue#push $B$r8F$S=P$7$?7k2L(B)$B:F3+$7$?;~$K$O(B Thread.critical $B$O(B false $B$K(B $B$J$C$F$$$k$O$:$G$9!#(B $B=>$C$F!"%k!<%W$N(B 2$B2s$jL\$G!"(B@que.empty? $B$ND>8e$K%9%l%C%I$N%3%s%F%-%9%H(B $B%9%$%C%A$,5/$3$k2DG=@-$,$"$k$h$&$K;W$$$^$9!#$=$N%?%$%_%s%0$GB>$N(B ($B>e5-(B $B$N(B Queue#push $B$r8F$S=P$7$?$b$N$H$O0[$J$k%9%l%C%I(B C $B$,(B) Queue#pop $B$r8F(B $B$S=P$9$H!"(B@que $B$,6u$K$J$j!"$5$i$K%9%l%C%I(B A $B$K%3%s%F%-%9%H%9%$%C%A$7$F(B $B=hM}$rB3$1$k$H6u$N(B @que $B$r(B shift $B$9$k$3$H$K$J$j!"(Bnil $B$,JV$jCM$K$J$k5$(B $B$,$7$^$9!#(B $B;DG0$J$,$i!"$3$NLdBj$rH/8=$5$;$k%F%9%H%9%/%j%W%H$r:n$k$3$H$O$G$-$^$;$s(B $B$G$7$?$,!"$3$N$h$&$J$3$H$,$*$-$J$$J]>Z$O$I$3$+$K$"$k$G$7$g$&$+(B? $B$b$7!"J]>Z$G$-$J$$$J$i!"A0$K(B sleep 1 unless Thread.critical $B$H(B $B$$$&%3!<%I$rF~$l$l$P!"LdBj$rH/8=$5$;$k$3$H$,$G$-$^$7$?!#(B -- [$BEDCf(B $BE/(B][$B$?$J$+(B $B$"$-$i(B][Tanaka Akira] $B!V$U$($m(B! $B$o$+$a$A$c$s:n@o$G$9$(C"=$B!W(B(Little Worker, $B7KM7@84](B)