MonitorMixin::ConditionVariable#wait timeout

2010e$BG/e(B5e$B7ne(B6e$BF|e(B23:08 Yusuke ENDOH [email protected]:

relative time e$B$G<u$1IU$1$k5!G=?t$,$"$k4D6-$G$7$+40A4$K$O<B8=$G$-$J$$e(B
e$B9M$($F$_$?$i!"e(Brelative time e$B$r;XDj$7$F$b!“e(Bspurious wakeup e$B$7$?>l9g$K!“e(B
e$B%7%9%F%`%/%m%C%/$,?.Mj$G$-$J$$$H$J$k$H!”$”$H$I$l$@$1e(B wait e$B$9$Y$-$J$N$+e(B
e$B7W;;$G$-$J$$5$$,$7$^$7$?!#e(B

e$B:#$Ne(Btimee$B%/%i%9$Oe(Bmonotonice$B;~4V$O$H$l$J$$$s$G$7$?$C$1!)e(B

e$B!V$“$H$I$l$@$1e(B wait e$B$9$Y$-!W$H$$$&>pJs$b$”$o$;$F65$($F$/$l$k5!G=$,e(B
e$B$"$k4D6-$C$FB8:_$9$k$s$G$9$+$M!#e(B

Linuxe$B$Ne(Bselecte$B$0$i$$$+$J$!!#$^$“0lHLE*$G$O$J$$$N$Ge(Brel-timee$B;H$&;~$Oe(B
spurious wakeupe$B$,$J$$$H?.$8$k!#$H$$$&;v$K$J$j$=$&$G$9$M$'e(B
e$B8=<BLdBj$H$7$F$O!”$[$H$s$I$N4D6-$G%7%0%J%k0J30$Ge(Bspurious
wakeupe$B$,e(B
e$B$J$$<BAu$K$J$C$F$$$k$H;W$&$7!“%7%0%J%k$O%?%$%^!<%9%l%C%I$Ke(B
e$B$$$/$O$:$J$N$Ge(Brubye$B$G$O$”$s$^$jLdBj$K$J$i$J$$5$$b$7$^$9!#e(B
e$B$G$bA4A33N?.$,;}$F$^$;$s$,!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B22:43 Yusuke ENDOH [email protected]:

#2629 e$B$Ne(B Hongli L. e$B$5$s$b!V$J$$$H$^$:$$!W$H<gD%$7$F$$$^$9$N$G!"e(B
e$B$=$C$A$b@bF@$7$F$$$?$@$1$^$9$+!#M}M3$r=q$$$Fe(B reject e$B$9$k$@$1$G$be(B
e$B9=$$$^$;$s$,!#e(B

http://redmine.ruby-lang.org/issues/show/2629#note-3
e$B$G1sF#$5$s$KF10U$7$F$$$k46$8$G$9$,!"$I$NItJ,$KF10U$7$F$$$k$s$G$9$+$M$'!#e(B

e$B>o$Ke(B @quit
e$B$r8!::$;$h!"$H$$$&ItJ,$KF10U$7$F$$$k$H$9$l$P$9$G$K@bF@:Q$_!"e(B
e$B$H$$$&5$$,$7$^$9$,!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B23:15 KOSAKI Motohiro
[email protected]:

Linuxe$B$Ne(Bselecte$B$0$i$$$+$J$!!#$^$“0lHLE*$G$O$J$$$N$Ge(Brel-timee$B;H$&;~$Oe(B
spurious wakeupe$B$,$J$$$H?.$8$k!#$H$$$&;v$K$J$j$=$&$G$9$M$'e(B
e$B8=<BLdBj$H$7$F$O!”$[$H$s$I$N4D6-$G%7%0%J%k0J30$Ge(Bspurious wakeupe$B$,e(B
e$B$J$$<BAu$K$J$C$F$$$k$H;W$&$7!“%7%0%J%k$O%?%$%^!<%9%l%C%I$Ke(B
e$B$$$/$O$:$J$N$Ge(Brubye$B$G$O$”$s$^$jLdBj$K$J$i$J$$5$$b$7$^$9!#e(B
e$B$G$bA4A33N?.$,;}$F$^$;$s$,!#e(B

e$B$"$H$Oe(B clock_gettime e$B$Ge(B CLOCK_MONOTONIC e$B$G$9$+$M!#e(B

Ruby e$B$bFbItE*$K;H$($k>l9g$K$O;H$C$F$$$k5$$,$7$^$9!#e(B

e$BA0ED$G$9!#e(B
e$B$*JV;v$,CY$/$J$C$F$9$_$^$;$s!#e(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B9:32 Yusuke ENDOH [email protected]:

e$B$h$$$H$$$&;XE&$b$"$j$^$9!#e(B

e$B@dBP;~9o$r<u$1IU$1$k$?$a$K$Oe(B thread.c e$B$r7k9=$$$m$$$mJQ$($J$$$H$$$1$J$$e(B
e$B$N$G!“$9$G$Ke(B feature freeze e$B8e$H$$$&$3$H$b$”$j!“J]<iE*$G$9$,e(B 1.9.2 e$B$G$Oe(B
revert e$B$7$h$&$H;W$$$^$9$,!”$$$+$,$G$7$g$&$+!#e(B

e$B$=$N8e$N5DO@$G!">e5-$NBP1~$,I,$:$7$b$9$0$KI,MW$H$$$&$o$1$G$O$J$$$He(B
e$B$$$&OC$K$J$C$F$$$k$h$&$J5$$,$9$k$N$G$9$,!“9g$C$F$$$k$G$7$g$&$+!#e(B
e$B$b$7$=$&$G$”$l$P!"e(B1.9.2e$B$N%j%j!<%98e$K@dBP;~9oe(Be$B$be(Be$B<u$1IU$1$k$h$&$K$9$ke(B
e$B$H$$$&$3$H$K$7$F!"e(Breverte$B$O$7$J$$$3$H$K$7$^$;$s$+!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B23:24 Tanaka A. [email protected]:

e$B$"$H$Oe(B clock_gettime e$B$Ge(B CLOCK_MONOTONIC e$B$G$9$+$M!#e(B

Ruby e$B$bFbItE*$K;H$($k>l9g$K$O;H$C$F$$$k5$$,$7$^$9!#e(B

e$B$J$k$[$I$H;W$C$F$$$?$N$G$9$,!“e(BCLOCK_MONOTONIC e$B$r<hF@$7$F$+$ie(B
timeout
e$BIU$-e(B wait e$B$r9T$&$^$G$N4V$Ke(B race
e$B$,$”$k$3$H$K5$$E$-$^$7$?!#e(B

e$B%7%9%F%`%/%m%C%/JQ99$KBP1~$7$?e(B timeout e$B$KI,MW$J$N$O!"e(Breltime
e$B;XDj$G$Oe(B
e$B$J$/!"e(BCLOCK_MONOTONIC e$B$N<4$K$*$1$ke(B abstime
e$B$N;XDj$G$O$J$$$G$7$g$&$+!#e(B

e$B$3$N$h$&$Ke(B reltime e$B;XDj$OHs>o$K5$$,IU$-$K$/$$e(B race
e$B$r:.F~$5$;$k$N$G!“e(B
e$B$d$O$jF~$l$k$Y$-$G$O$J$$!”$H$$$&<(:6$N$h$&$K46$8$^$9!#e(B

timeout

e$B$7$F$9$0$=$N%9%l%C%I$K<B9T8"8B$,Mh$k$H8@$&J]>Z$O$I$&$;$J$$e(B

e$B$N$G!“AjBP;~9o$N7W;;$N8m:9$/$i$$$O5$$K$7$J$/$F$b$$$$$N$+$J$”$H$$$&e(B

e$B5$$b$9$k$N$G$9$,!#Fq$7$$!#e(B

kosakie$B$G$9e(B

e$B%7%9%F%`%/%m%C%/JQ99$KBP1~$7$?e(B timeout e$B$KI,MW$J$N$O!"e(Breltime e$B;XDj$G$Oe(B
e$B$J$/!"e(BCLOCK_MONOTONIC e$B$N<4$K$*$1$ke(B abstime e$B$N;XDj$G$O$J$$$G$7$g$&$+!#e(B

e$B$3$l$O!"8F$S=P$7$b$H$Ke(Breltime->abstimee$BJQ49$N@UG$$r2!$7$D$1$F$$$k$@$1$Ge(B
racee$B$N>l=j$,JQ$o$C$F$$$k$@$1$K8+$($k$N$G$9$,!"8F$S=P$785$GJQ49$9$k$He(B
racee$B$,2r7h$9$k$N$G$7$g$&$+!)e(B

e$B$"!“3NG’$G$9$,!”$3$3$G$$$C$F$$$ke(Bracee$B$H$$$&$N$Oe(Babstimee$B$KJQ49$7$?D>8e$Ke(B
e$B%3%s%F%-%9%H%9%$%C%A$7$?$i$I$&$7$h$&!"$H$$$&OC$G$9$h$M!)e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B22:54 Tanaka A. [email protected]:

2010e$BG/e(B5e$B7ne(B6e$BF|e(B22:43 Yusuke ENDOH [email protected]:

#2629 e$B$Ne(B Hongli L. e$B$5$s$b!V$J$$$H$^$:$$!W$H<gD%$7$F$$$^$9$N$G!"e(B
e$B$=$C$A$b@bF@$7$F$$$?$@$1$^$9$+!#M}M3$r=q$$$Fe(B reject e$B$9$k$@$1$G$be(B
e$B9=$$$^$;$s$,!#e(B

http://redmine.ruby-lang.org/issues/show/2629#note-3
e$B$G1sF#$5$s$KF10U$7$F$$$k46$8$G$9$,!"$I$NItJ,$KF10U$7$F$$$k$s$G$9$+$M$'!#e(B

http://redmine.ruby-lang.org/issues/show/2629#note-2 e$B$Ne(B

  • e$B!Ve(BETIMEOUT e$B$,$"$k$H$^$:$$!W$H$$$&$N$O[9M+$@$C$?e(B
  • e$B$5$i$K8=:_$Ne(B API e$B$K$Oe(B race e$B$,$"$k$3$H$,$o$+$C$?e(B

e$B$NJ}$KF10U$7$F$$$k$H;W$$$^$9!#%?%$%_%s%0E*$K!#e(B

e$B$=$&$$$($PK:$l$F$$$^$7$?$,!"e(BJava e$B$Ne(B Object#wait e$B$,e(B
ETIMEOUT e$B$rJV$5$J$$e(B
e$B$s$G$7$?!#!V$J$/$F$b$h$$!W$NJ}$N<+?.$,$A$g$C$H6/$^$C$?!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B11e$BF|e(B1:06 KOSAKI Motohiro
[email protected]:

e$B$“!“3NG’$G$9$,!”$3$3$G$$$C$F$$$ke(Bracee$B$H$$$&$N$Oe(Babstimee$B$KJQ49$7$?D>8e$Ke(B
e$B%3%s%F%-%9%H%9%$%C%A$7$?$i$I$&$7$h$&!”$H$$$&OC$G$9$h$M!)e(B

pthread_cond_timedwait e$B$Ne(B RATIONALE
e$B$G=q$+$l$F$$$?LdBj$NJ}$G$9!#e(B
e$B$3$NLdBj$Oe(B CLOCK_MONOTONIC
e$B$@$m$&$H%7%9%F%`%/%m%C%/$@$m$&$HF1$8$h$&$Ke(B
e$BH/@8$9$k$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$B!Ve(B3
e$BIC$4$H$KDj4|=hM}!"%7%0%J%k$5$l$?$i$9$0$K=*N;!W$NNc$@$H!"e(Breltime
e$B;XDj$@$H!"e(B

m.synchronize do
t = Time.now + 3
until predicate
t2 = Time.now
# (A)
cv.wait(m, t - t2) if t > t2
break if predicate
if Time.now > t
t += 3
# e$BDj4|=hM}$r$9$ke(B
end
end
# predicate e$B$,??$K$J$C$?e(B
end

(A) e$B$N0LCV$G%3%s%F%-%9%H%9%$%C%A$7$?>l9g!“e(Bwait
e$B$r8F$S=P$9;~$K$Oe(B t2 e$B$Ne(B
e$BCM$O8=:_;~9o$+$i8E$/$J$C$F$7$^$C$F$$$k$?$a!”%?%$%`%"%&%H$O;~9oe(B t
e$B$h$je(B
e$B%3%s%F%-%9%H%9%$%C%A$7$F$$$?4|4V$NJ,$@$13N<B$KCY$l$F$7$^$$$^$9!#e(B

abstime e$B;XDj$N>l9g!"e(B

m.synchronize do
t = Time.now + 3
until predicate
# (B)
cv.wait(m, t)
break if predicate
if Time.now > t
t += 3
# e$BDj4|=hM}$r$9$ke(B
end
end
# predicate e$B$,??$K$J$C$?e(B
end

(B) e$B$N0LCV$G%3%s%F%-%9%H%9%$%C%A$7$F$be(B t
e$B$NCM$K1F6A$O$J$$$?$a!“%?%$%`e(B
e$B%”%&%H$9$k$N$O;~9oe(B t e$B$G!“LdBj$”$j$^$;$s!#e(B

e$B$J$s$@$+$h$/$o$+$i$J$/$J$C$F$-$?$N$G!"e(Breltime
e$B;XDj$NJ}$,$h$$$H$$$&Nc$re(B
e$B%3!<%I$G=q$$$F$_$F$b$i$($J$$$G$7$g$&$+!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B11e$BF|e(B4:14 Masaya TARUI [email protected]:

create_newthread
cv.wait(m,Time.now+3)
e$B$H$7$F$b!"e(BTime.nowe$B$r<hF@$7$?8e$K%9%l%C%I@Z$jBX$($,H/@8$7$9$k$H!"e(B
e$B%m%C%/$r3+J|$7$F$$$k;~4V$,C;$/$J$C$F$7$^$$$^$9!#e(B

e$B$3$l$Oe(Breltime e$B;XDj$NJ}$,$h$$$N$G$O$J$$$G$7$g$&$+!#e(B
e$B7k6I%9%l%C%I@Z$jBX$($K$h$k1F6A$G9M$($k$H$I$C$A$b$I$C$A$+$H!#e(B

e$B!V@53N$Ke(B 3 e$BIC4Ve(B Mutex
e$B$r3+J|$9$k!W$H$$$&<{MW$,$“$k$N$+!”$"$C$?$H$7$Fe(B
e$B@5Ev$J$b$N$+$o$+$i$J$$$N$G$9$,!"e(Bspurious wakeup
e$B$r9M$($k$H!"86M}E*$Ke(B
e$BC#@.IT2DG=$JMW5a$@$H;W$$$^$9!#e(B

e$BDL;;$Ge(B 3 e$BIC4V3+J|$9$k$3$H$bFq$7$=$&$G$9!#e(B

t = 3
until predicate
t1 = Time.now
cv.wait(m, t)
# (A)
t -= Time.now - t1
if t <= 0
# timeout
predicate = true
end
end

spurious wakeup e$B8e$Ke(B (A)
e$B$N2U=j$G%3%s%F%-%9%H%9%$%C%A$7$?$i!“DL;;$G$be(B
3 e$BIC4V$h$jC;$$4|4V$7$+3+J|$5$l$^$;$s!#2?$+<j$,$”$k$G$7$g$&$+!#e(B

e$BC.2H$G$9!#e(B
e$B2#$+$i<:Ni$7$^$9!#e(B

e$B$J$s$@$+$h$/$o$+$i$J$/$J$C$F$-$?$N$G!"e(Breltime e$B;XDj$NJ}$,$h$$$H$$$&Nc$re(B
e$B%3!<%I$G=q$$$F$_$F$b$i$($J$$$G$7$g$&$+!#e(B

e$B!Ve(B3 e$BIC$4$H$KDj4|=hM}!“%7%0%J%k$5$l$?$i$9$0$K=*N;!W$re(B
e$B!Ve(B3
e$BIC$O%j%=!<%9$r3+J|$7$FDj4|=hM}!”%7%0%J%k$5$l$?$i$9$0$K=*N;!W$Ke(B
e$B$9$k$He(B

reltimee$B$@$He(B
create_newthread
cv.wait(m,3)
e$B$J$N$KBP$7$F!"e(B

abstimee$B$@$He(B
create_newthread
cv.wait(m,Time.now+3)
e$B$H$7$F$b!"e(BTime.nowe$B$r<hF@$7$?8e$K%9%l%C%I@Z$jBX$($,H/@8$7$9$k$H!"e(B
e$B%m%C%/$r3+J|$7$F$$$k;~4V$,C;$/$J$C$F$7$^$$$^$9!#e(B

e$B$3$l$Oe(Breltime e$B;XDj$NJ}$,$h$$$N$G$O$J$$$G$7$g$&$+!#e(B
e$B7k6I%9%l%C%I@Z$jBX$($K$h$k1F6A$G9M$($k$H$I$C$A$b$I$C$A$+$H!#e(B

e$B8e$O47=,E*$Ke(Btimeoute$B$Oe(Breltimee$B$@$H;W$&$N$G%R%e!<%^%s%(%i!<$rHr$1$k$?$a$K$O!"e(B
reltime e$B;XDj$NJ}$,$h$$$H;W$$$^$9!#e(B

2010e$BG/e(B5e$B7ne(B11e$BF|e(B3:24 Yusuke ENDOH [email protected]:

e$BC.2H$G$9!#e(B

e$B!V@53N$Ke(B 3 e$BIC4Ve(B Mutex e$B$r3+J|$9$k!W$H$$$&<{MW$,$"$k$N$+!"$"$C$?$H$7$Fe(B
e$B@5Ev$J$b$N$+$o$+$i$J$$$N$G$9$,!"e(Bspurious wakeup e$B$r9M$($k$H!"86M}E*$Ke(B
e$BC#@.IT2DG=$JMW5a$@$H;W$$$^$9!#e(B

3e$BIC4Ve(BMutexe$B$r3+J|$9$k$H$$$&<{MW$O%j%=!<%9$rFH@j$7$J$$$H$$$&E@$+$i$"$k$N$G$9$,!“e(B
e$BJL$Ke(Bsignale$B$G$9$0=*N;$9$kI,MW$,$”$j$^$;$s$G$7$?!#e(B
e$B$A$g$C$H9M$($k$He(BConditionVariablee$B$G<B8=$9$kI,MW$O$J$/!“e(B
sleep 3 until m.synchronize do
if !predicate
#e$BDj4|=hM}e(B
end
predicate
end
e$B$”$?$j$G==J,$G$9!#e(B

e$B$=$7$Fe(Bspurious wakeup
e$B$,$"$ke(BConditionVariablee$B$K$O3N$+$Ke(Babstimee$B$NJ}$,@5$7$$$G$9$M!#e(B
e$BJY6/$,B-$j$F$^$;$s$G$7$?!#?=$7Lu$"$j$^$;$s!#e(B

2010e$BG/e(B5e$B7ne(B11e$BF|e(B19:17 Masaya TARUI [email protected]:

3e$BIC4Ve(BMutexe$B$r3+J|$9$k$H$$$&<{MW$O%j%=!<%9$rFH@j$7$J$$$H$$$&E@$+$i$"$k$N$G$9$,!“e(B
e$BJL$Ke(Bsignale$B$G$9$0=*N;$9$kI,MW$,$”$j$^$;$s$G$7$?!#e(B
e$B$A$g$C$H9M$($k$He(BConditionVariablee$B$G<B8=$9$kI,MW$O$J$/!“e(B
sleep 3 until m.synchronize do
if !predicate
#e$BDj4|=hM}e(B
end
predicate
end
e$B$”$?$j$G==J,$G$9!#e(B

e$B$3$N%9%l%C%I$O$I$&$d$C$F=*N;$5$;$k$s$G$7$g$&$+!#e(B

[ruby-core:27698] e$B$Ne(B Hongli L. e$B$O$=$3$Ge(B ConditionVariable
e$B$r;H$C$F$$$ke(B
e$B$h$&$K;W$($^$9!#e(B

2010e$BG/e(B5e$B7ne(B12e$BF|e(B23:39 Tanaka A. [email protected]:

end
e$B$"$?$j$G==J,$G$9!#e(B

e$B$3$N%9%l%C%I$O$I$&$d$C$F=*N;$5$;$k$s$G$7$g$&$+!#e(B

e$B85$NNc$K0lHV6a$$7A$G$Oe(B
m.synchronize { predicate = ture }
e$B$G$9!#e(B
e$B$9$P$d$/;$a$?$$$J$i$Pe(Bpredicatee$B$r;}$?$:$K!"e(B
m.synchronize { th.raise HogeInterrupt }
e$B$H$+2>$K30It3d9~$
$N@)8f$,F~$C$?$ie(B
th.raise HogeInterrupt e$B$@$1$G$b$$$$$O$:$G$9!#e(B

[ruby-core:27698] e$B$Ne(B Hongli L. e$B$O$=$3$Ge(B ConditionVariable e$B$r;H$C$F$$$ke(B
e$B$h$&$K;W$($^$9!#e(B

e$B!Ve(B3
e$BIC$4$H$KDj4|=hM}!“%7%0%J%k$5$l$?$i$9$0$K=*N;!W$KBP1~$7$F!“e(B
e$B=q$$$F$7$^$$$7$^$$$^$7$?$,!”$3$A$i$bK\Ev$K$b$7%7%0%J%k$5$l$?$i$9$0=N;$G$h$$$N$J$ie(B
mutexe$B$r<h$j$K9T$/e(BConditionVariablee$B$O8zN($,0-$$$N$G0c$&;EAH$_$r;H$C$?J}$,NI$$$G$7$g$&!#e(B
e$BB?J,0c$&$O$:$G!"$=$3$,;d$,0lHV4
0c$$$7$F$$$?E@$@$H;W$$$^$9!#$-$C$He(Bpredicatee$B$K$h$C$Fe(BMutexe$BFb$G=hM}$r9T$&$N$G$7$g$&!#e(B
e$B85$NBj:`$,!”%7%0%J%k$r<u$1$?;~$Ke(B
predicatee$B$K$h$C$Fe(BMutexe$BFb$G?7$7$$=hM}$r9T$&$H$9$k$J$i$P!“$=$l$KBP1~$7$?e(B
e$B!Ve(B3
e$BIC$O%j%=!<%9$r3+J|$7$FDj4|=hM}!”%7%0%J%k$5$l$?$i$9$0$K=*N;!W$G$O!"B?J,$G$9$,!"L5@)8B$Ne(Bwaite$B$H%?%$%^!<3d9~$_$rAH$_9g$o$;$?=hM}$r=q$-$^$9!#e(B

2010e$BG/e(B5e$B7ne(B13e$BF|e(B22:19 Masaya TARUI [email protected]:

e$B$3$N%9%l%C%I$O$I$&$d$C$F=*N;$5$;$k$s$G$7$g$&$+!#e(B

e$B85$NNc$K0lHV6a$$7A$G$Oe(B
m.synchronize { predicate = ture }
e$B$G$9!#e(B
e$B$9$P$d$/;$a$?$$$J$i$Pe(Bpredicatee$B$r;}$?$:$K!"e(B
m.synchronize { th.raise HogeInterrupt }
e$B$H$+2>$K30It3d9~$
$N@)8f$,F~$C$?$ie(B
th.raise HogeInterrupt e$B$@$1$G$b$$$$$O$:$G$9!#e(B

e$B$(!<!"e(BThread#raise e$B$r;H$&$s$G$9$+!#e(B

Thread#raise e$B$O7uF]$J$N$G!“Hr$1$?$[$&$,$$$$$H;W$$$^$9!#e(B
ConditionVariable e$B$GHr$1$i$l$k$N$K!”$"$($Fe(B Thread#raise
e$B$,I,MW$JJ}K!$re(B
e$B$H$k$N$O$h$m$7$/$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

[ruby-core:27698] e$B$Ne(B Hongli L. e$B$O$=$3$Ge(B ConditionVariable e$B$r;H$C$F$$$ke(B
e$B$h$&$K;W$($^$9!#e(B

e$B!Ve(B3 e$BIC$4$H$KDj4|=hM}!“%7%0%J%k$5$l$?$i$9$0$K=*N;!W$KBP1~$7$F!“e(B
e$B=q$$$F$7$^$$$7$^$$$^$7$?$,!”$3$A$i$bK\Ev$K$b$7%7%0%J%k$5$l$?$i$9$0=N;$G$h$$$N$J$ie(B
mutexe$B$r<h$j$K9T$/e(BConditionVariablee$B$O8zN($,0-$$$N$G0c$&;EAH$_$r;H$C$?J}$,NI$$$G$7$g$&!#e(B
e$BB?J,0c$&$O$:$G!"$=$3$,;d$,0lHV4
0c$$$7$F$$$?E@$@$H;W$$$^$9!#$-$C$He(Bpredicatee$B$K$h$C$Fe(BMutexe$BFb$G=hM}$r9T$&$N$G$7$g$&!#e(B
e$B85$NBj:`$,!”%7%0%J%k$r<u$1$?;~$Ke(B predicatee$B$K$h$C$Fe(BMutexe$BFb$G?7$7$$=hM}$r9T$&$H$9$k$J$i$P!“$=$l$KBP1~$7$?e(B e$B!Ve(B3
e$BIC$O%j%=!<%9$r3+J|$7$FDj4|=hM}!”%7%0%J%k$5$l$?$i$9$0$K=*N;!W$G$O!"B?J,$G$9$,!"L5@)8B$Ne(Bwaite$B$H%?%$%^!<3d9~$_$rAH$_9g$o$;$?=hM}$r=q$-$^$9!#e(B

e$B$9$_$^$;$s!#2?2s$+FI$s$@$s$G$9$,!"$h$/J,$+$j$^$;$s$G$7$?!#e(B

2010e$BG/e(B5e$B7ne(B15e$BF|e(B18:43 Tanaka A. [email protected]:

th.raise HogeInterrupt e$B$@$1$G$b$$$$$O$:$G$9!#e(B

e$B$(!<!"e(BThread#raise e$B$r;H$&$s$G$9$+!#e(B

Thread#raise e$B$O7uF]$J$N$G!“Hr$1$?$[$&$,$$$$$H;W$$$^$9!#e(B
ConditionVariable e$B$GHr$1$i$l$k$N$K!”$"$($Fe(B Thread#raise e$B$,I,MW$JJ}K!$re(B
e$B$H$k$N$O$h$m$7$/$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

e$B$I$N$_$Ae(BConditionVariablee$B$Ge(BThread#raisee$B$r;H$C$F$^$;$s$G$7$?$C$1!)$H;W$C$?$i;~4V;XDj$7$F$$$k;~$@$1$G$9$M!#e(B
ConditionVariablee$B$H$[$\F1$8$K$J$j$^$9$,!"e(B
m.synchronize { predicate = ture ; th.run }
e$B$,$h$$$G$7$g$&$+!)e(B

e$B$b$A$m$s!"e(BThread#raisee$B$r<h$j4,$/:#$N;EMM$N0-$5$OM}2r$7$F$k$N$G2?$b9M$($:$K;H$&$N$O$I$&$+$H;W$$$^$9$,!"e(B
e$B>u67<!Bh$G$O$J$$$G$7$g$&$+!)e(B
ConditionVariable
e$B$Oe(Bme$B$N%m%C%/>u67<!Bh$G$I$l$@$1CY1d$9$k$+J,$+$i$J$$$N$G!"e(B
Thread#raisee$B$H$I$A$i$,$$$$$+$O>u67$K$h$C$FJQ$o$k$H;W$$$^$9!#e(B
e$B7uF]$H$$$C$F$b@5$7$/;H$&J,$K$OJXMx$J@)8f$G$9!#e(B

e$B$9$_$^$;$s!#2?2s$+FI$s$@$s$G$9$,!“$h$/J,$+$j$^$;$s$G$7$?!#e(B
e$B2]Bj$r8m2r$7$F$$$?ItJ,$,$”$j$^$7$?!#$H$$$&<q;]$G$9!#<XB-$@$C$?$+$b$7$l$^$;$s!#e(B

e$B85$NBj:`$,!"%7%0%J%k$r<u$1$?;~$Ke(B predicatee$B$K$h$C$Fe(BMutexe$BFb$G?7$7$$=hM}$r9T$&$H$9$k$J$i$P!"$=$l$KBP1~$7$?e(B e$B!Ve(B3
e$BIC$O%j%=!<%9$r3+J|$7$FDj4|=hM}!"%7%0%J%k$5$l$?$i$9$0$K=*N;!W$G$O!"B?J,$G$9$,!"L5@)8B$Ne(Bwaite$B$H%?%$%^!<3d9~$_$rAH$_9g$o$;$?=hM}$r=q$-$^$9!#e(B

e$B%a!<%k$@$7$?D>8e$K!“e(Bpredicatee$B$r%A%’%C%/$9$k$?$a$Ke(BCVe$B$K;H$&e(BMutexe$B$O<h$i$J$$$H$$$1$J$$$N$G!”%j%=!<%9$O$=$b$=$b0c$&e(BMutexe$B$G4IM}$9$ke(B
e$B$H8@$&;v$bI,MW$J$N$K5$$E$-$^$7$?!#K\Bj$G$O$J$$$G$$$$$+$b$7$l$^$;$s$,!"0l1~DI2C$7$F$*$-$^$9!#e(B

2010e$BG/e(B5e$B7ne(B16e$BF|e(B0:27 Masaya TARUI [email protected]:

e$B$(!<!"e(BThread#raise e$B$r;H$&$s$G$9$+!#e(B

Thread#raise e$B$O7uF]$J$N$G!“Hr$1$?$[$&$,$$$$$H;W$$$^$9!#e(B
ConditionVariable e$B$GHr$1$i$l$k$N$K!”$"$($Fe(B Thread#raise e$B$,I,MW$JJ}K!$re(B
e$B$H$k$N$O$h$m$7$/$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

e$B$I$N$_$Ae(BConditionVariablee$B$Ge(BThread#raisee$B$r;H$C$F$^$;$s$G$7$?$C$1!)$H;W$C$?$i;~4V;XDj$7$F$$$k;~$@$1$G$9$M!#e(B

e$B;H$C$F$$$J$$$h$&$K;W$&$s$G$9$,!"$I$3$G;H$C$F$^$9$+e(B?

ConditionVariablee$B$H$[$\F1$8$K$J$j$^$9$,!"e(B
m.synchronize { predicate = ture ; th.run }
e$B$,$h$$$G$7$g$&$+!)e(B

e$B$3$l$Oe(B race condition e$B$,$"$j$^$9$M!#e(B
e$BLdBj$N%9%l%C%I$,%m%C%/$r30$7$?8e!"e(Bsleep e$B$9$kA0$Ke(B
e$B%3%s%F%-%9%H%9%$%C%A$7$Fe(B th.run e$B$,F0$/$H!“e(B
e$B$=$Ne(B th.run e$B$OL5;k$5$l$F!”?2$F$7$^$&$s$8$c$J$$$G$7$g$&$+!#e(B

e$B$b$A$m$s!"e(BThread#raisee$B$r<h$j4,$/:#$N;EMM$N0-$5$OM}2r$7$F$k$N$G2?$b9M$($:$K;H$&$N$O$I$&$+$H;W$$$^$9$,!"e(B
e$B>u67<!Bh$G$O$J$$$G$7$g$&$+!)e(B
ConditionVariable e$B$Oe(Bme$B$N%m%C%/>u67<!Bh$G$I$l$@$1CY1d$9$k$+J,$+$i$J$$$N$G!"e(B
Thread#raisee$B$H$I$A$i$,$$$$$+$O>u67$K$h$C$FJQ$o$k$H;W$$$^$9!#e(B
e$B7uF]$H$$$C$F$b@5$7$/;H$&J,$K$OJXMx$J@)8f$G$9!#e(B

e$BDj4|E*$J=hM}e(B ([ruby-core:27698] e$B$G$$$($Pe(B cleaning function)
e$B$r<B9T$7$F$$$ke(B
e$B:GCf$OCfCG$7$?$/$J$$$H$9$k$H!"e(BThread#raise e$B$r;H$&>l9g$G$be(B m
e$B$r%m%C%/$7$J$$$He(B
e$B$$$1$J$$$G$7$g$&!#e(B

[ruby-dev:41310] e$B$Ge(B Thread#raise e$B$re(B m.synchronize
e$B$N%V%m%C%/$NCf$KF~$l$F$"$ke(B
e$B$N$O$=$&$$$&$3$H$@$H;W$C$F$$$?$s$G$9$,0c$&$s$G$7$g$&$+!#e(B

e$BDj4|E*$J=hM}$N:GCf$G$bCfCG$7$?$$!“$H$$$&MW5a$O$”$j$($^$9$,!"e(B
e$B$=$l$O:#2s$Ne(B ConditionVariable
e$B$NOC$H$O0[$J$kMW5a$@$H;W$$$^$9!#e(B

e$B$I$N$_$Ae(BConditionVariablee$B$Ge(BThread#raisee$B$r;H$C$F$^$;$s$G$7$?$C$1!)$H;W$C$?$i;~4V;XDj$7$F$$$k;~$@$1$G$9$M!#e(B
e$B;H$C$F$$$J$$$h$&$K;W$&$s$G$9$,!"$I$3$G;H$C$F$^$9$+e(B?

e$B<!$NF|$ND+$K$O5$$E$$$FD{@5$N%a!<%k$r=P$=$&$+9M$($?$N$G$9$,!"$=$l$@$1$G=P$9$N$b$I$&$+$H;W$$J|CV$7$F$^$7$?!#e(B
e$B$*<j?t$r$o$:$o$i$;$?$J$i$9$$$^$;$s!#e(B

ConditionVariablee$B$H$[$\F1$8$K$J$j$^$9$,!"e(B
m.synchronize { predicate = ture ; th.run }
e$B$,$h$$$G$7$g$&$+!)e(B

e$B$3$l$Oe(B race condition e$B$,$"$j$^$9$M!#e(B
e$BLdBj$N%9%l%C%I$,%m%C%/$r30$7$?8e!"e(Bsleep e$B$9$kA0$Ke(B
e$B%3%s%F%-%9%H%9%$%C%A$7$Fe(B th.run e$B$,F0$/$H!“e(B
e$B$=$Ne(B th.run e$B$OL5;k$5$l$F!”?2$F$7$^$&$s$8$c$J$$$G$7$g$&$+!#e(B

e$BK\Ev$G$9$M!#!#!#e(B
Thread#rune$B$G5/$3$9;~$K$Oe(Bm.sleepe$B$r;H$o$J$$$He(Brace
conditione$B$,H/@8$9$k$H8@$&$3$H$G$9$M!#e(B
e$B$=$&$9$k$H:#$Ne(BRubye$B$N;EMM$G6&M-JQ?t$r;H$C$?@)8f$G$Oe(BConditionVariablee$B$H$^$C$?$/F1$8$K$J$ke(B

ConditionVariablee$B$r;H$($P$$$$$8$c$J$$$+$H$$$&;v!"N;2r$7$^$7$?!#e(B

[ruby-dev:41310] e$B$Ge(B Thread#raise e$B$re(B m.synchronize e$B$N%V%m%C%/$NCf$KF~$l$F$"$ke(B
e$B$N$O$=$&$$$&$3$H$@$H;W$C$F$$$?$s$G$9$,0c$&$s$G$7$g$&$+!#e(B

[ruby-dev:41310]e$B$K$D$$$F$O!"$=$&$$$&0U?^$G$"$C$F$$$^$9!#e(B
[ruby-dev:41323]e$B$G$$$C$F$$$kCY1d$K$D$$$F$O!"e(Bsignale$B$r<u$1$?8e$Ne(Blocke$B$K$D$$$F8@$C$F$$$^$9!#e(B
e$B$b$H$b$H$NL?Bj$,!V%7%0%J%k$5$l$?$i$9$0$K=*N;!W$@$C$?$N$G!#e(B