Feature #3251: allow to unlock mutex locked by another thread
http://redmine.ruby-lang.org/issues/show/3251
e$B5/I<<Te(B: Yusuke E.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal
e$BC4Ev<Te(B: Koichi Sasada, e$B%+%F%4%je(B: core, Target version: 1.9.x
e$B1sF#$G$9!#e(B
e$B8=>u$G$Oe(B mutex e$B$Oe(B lock e$B$7$?%9%l%C%I$+$i$7$+e(B unlock
e$B$G$-$^$;$s$,!“e(B
e$B$3$l$r5v2D$9$k$h$&$K$7$^$;$s$+!#F05!$Oe(B 2 e$B$D$”$j$^$9!#e(B
- Python e$B$Ne(B condition variable e$B$,e(B mutex
e$B$rJL%9%l%C%I$+$ie(B unlock
e$B$9$k$3$H$G<BAu$5$l$F$$$k!"$N$,??;w$G$-$ke(B - Thread#raise e$B$re(B race condition e$B$J$7$K;H$($k$h$&$K$J$ke(B
(e$B5$$,$9$ke(B)
1 e$B$K$D$$$F!"e(BPython e$B$Ne(B condition variable
e$B$O0J2<$N$h$&$J46$8$K<BAue(B
e$B$5$l$F$$$^$9!#e(B
def wait(m1)
m2 = Mutex.new
m2.lock
@waiters << m2
m1.unlock
begin
m2.lock
ensure
m1.lock
end
end
def signal
@waiters.shift.unlock
end
e$B$D$^$j!"e(Bwait e$B$OFs=E$Ke(B mutex e$B$re(B lock
e$B$7$h$&$H$9$k$3$H$G%V%m%C%/$7!"e(B
signal e$B$Oe(B mutex e$B$rJL%9%l%C%I$+$ie(B unlock
e$B$9$k$3$H$G%V%m%C%/$7$F$$$ke(B
e$B%9%l%C%I$r:F3+$7$^$9!#e(B
e$B:#$Ne(B ConditionVariable
e$B$N<BAu$K$OBgNL$NLdBjE@$,;XE&$5$l$F$$$k$N$G!"e(B
Python e$B$N??;w$r$9$k$H$h$$$N$G$O$H;W$$$^$9!#e(B
e$B8"0R<g5Ae(B
2 e$B$K$D$$$F!"8=>u$Oe(B Thread#raise e$B$K$O0J2<$N$h$&$Je(B race
e$B$,B8:_$7$^$9!#e(B
t1: begin e$B@a$r<B9T$7$F$$$ke(B
t2: t1.raise e$B$9$ke(B
t1: rescue/ensure e$B@a$N<B9T$r3+;O$9$ke(B
t3: t1.raise e$B$9$ke(B
t1: rescue/ensure e$B@a$,<B9T$5$l$J$$$^$^:FEYNc30$,H/@8$9$ke(B
e$B$A$J$$K$3$Ne(B race e$B$O%7%0%J%k$K$bB8:$7$^$9e(B
e$B$3$l$r!"e(BThread#raise e$B$NA0$Ke(B Mutex#lock
e$B$9$k$H$$$&%k!<%k$K$9$l$P!"e(B
race e$B$rHr$1$F;H$&$3$H$,$G$-$k$h$&$K$J$j$^$9!#$H;W$$$^$9!#e(B
t1: begin e$B@a$r<B9T$7$F$$$ke(B
t2: m.lock; t1.raise e$B$9$ke(B
t1: rescue/ensure e$B@a$N<B9T$r3+;O$9$ke(B
t3: m.lock e$B$,;_$^$i$J$$$N$Ge(B t1.raise e$B$G$-$J$$e(B
t1: e$B<!$NNc30$,Ej$29~$^$l$k=`Hw$,$G$-$?$ie(B m.unlock e$B$9$ke(B
t3: m.lock e$B$,=*$o$C$Fe(B t1.raise e$B$9$ke(B
–
Yusuke E. [email protected]