[Feature #3251] allow to unlock mutex locked by another thread

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

  1. 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
  2. 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]

e$B!!$5$5$@$G$9!%e(B

(2010/05/06 1:24), Yusuke E. wrote::

e$B$3$l$r5v2D$9$k$h$&$K$7$^$;$s$+!#F05!$Oe(B 2 e$B$D$"$j$^$9!#e(B

  1. 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
  2. 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)

e$B!!e(BPython e$B$O$J$<e(B Mutex
e$B$rB>$+$i2rJ|$G$-$k$N$+!$$h$/$o$+$i$J$$$N$G$9$,!$e(B

e$B695A$K$O!“%_%e!<%F%C%/%9$N>l9g$K$=$l$r%m%C%/e(B(Pe$BA:ne(B)e$B$7$?%?%9%/$N$_$,%"e(B e$B%s%m%C%/e(B(Ve$BA:ne(B)e$B$G$-$k$N$KBP$7$F!”%;%^%U%)$G$O$=$NMM$J@)Ls$O$J$$!#e(B

e$B$H$$$&$3$H$G!$e(BMutex
e$B$H$$$&L>A0$@$H!$B>$+$i2rJ|=PMh$J$$!$$H$$$&%K%e%“%s%9e(B
e$B$,4^$^$l$F$k$s$8$c$J$$$+$J$!!$$H$$$&463P$,$”$j$^$9!%e(B

e$B!!B>$N%7%9%F%`$@$H!$%;%^%U%)$,$"$k$+$i$$$$$8$c$s!$$H$$$&$3$H$J$N$+$b$7$le(B
e$B$:!$$8$c$!e(B Ruby
e$B$K$b%;%^%U%)$rF~$l$J$$$H$$$1$J$$!$$H$$$&$3$H$+$b$7$l$^$;$s!%e(B

e$B!!!V463P!W$J$N$G!$:,5r$N$"$kOC$G$O$J$$$s$G$9$,!$MQ8l$N:.Mp$rHr$1$k$?$a$Ke(B
e$B$b!$!VJXMx$=$&$@$+$iF~$l$A$c$(!W$H$$$&$N$O$^$:$$$s$G$O$J$$$+$H6r9M$9$k<!e(B
e$BBh$G$9!%e(BFiber
e$B$H$+$F$-$H!<$KF~$l$A$c$C$??M4V$,8@$&$N$b$J$s$G$9$,!%e(B

e$B!!$=$b$=$b!$e(BMutex e$B$Oe(B critical section
e$B$r:n$k$?$a$N$b$N$J$Ne(B
e$B$G!$e(Block/unlock e$B$O;H$o$J$$$GM_$7$$$J$!!$$H$$$&5$$,$7$^$9!%$Je(B
e$B$i!$e(BCriticalSection e$B%/%i%9$G$b:n$k$Y$-$J$N$+$J!%e(B

kosakie$B$G$9e(B

e$B$H$$$&$3$H$G!$e(BMutex e$B$H$$$&L>A0$@$H!$B>$+$i2rJ|=PMh$J$$!$$H$$$&%K%e%"%s%9e(B
e$B$,4^$^$l$F$k$s$8$c$J$$$+$J$!!$$H$$$&463P$,$"$j$^$9!%e(B

e$BB>$N%7%9%F%`$@$H!$%;%^%U%)$,$"$k$+$i$$$$$8$c$s!$$H$$$&$3$H$J$N$+$b$7$le(B
e$B$:!$$8$c$!e(B Ruby e$B$K$b%;%^%U%)$rF~$l$J$$$H$$$1$J$$!$$H$$$&$3$H$+$b$7$l$^$;$s!%e(B

e$B!V463P!W$J$N$G!$:,5r$N$"$kOC$G$O$J$$$s$G$9$,!$MQ8l$N:.Mp$rHr$1$k$?$a$Ke(B
e$B$b!$!VJXMx$=$&$@$+$iF~$l$A$c$(!W$H$$$&$N$O$^$:$$$s$G$O$J$$$+$H6r9M$9$k<!e(B
e$BBh$G$9!%e(BFiber e$B$H$+$F$-$H!<$KF~$l$A$c$C$??M4V$,8@$&$N$b$J$s$G$9$,!%e(B

e$B;W$$$D$/8B$j#1$D$@$1%G%a%j%C%H$,$"$j$^$9!#e(BLinuxe$B$@$He(Bmutexe$B$He(Bsemaphoee$B$NN>J}$,e(B
e$B%+!<%M%kFb$K$"$k$o$1$J$s$G$9$,!“e(Bsemaphoee$B$O$=$N%;%^%s%F%#%/%9>ee(B
lockdepe$B!J%+!<%M%kFb%m%C%/%P%j%G!<%?!KHs%5%]!<%H$G$”$j!"6aG/$G$O6/$/Hs?d>)$Ke(B
e$B6a$$%9%F!<%?%9$H$J$C$F$$$^$9!#e(B

semaphoee$B%;%^%s%F%#%/%9$@$He(BABBAe$B%G%C%I%m%C%/$r8!CN$7$F$bBh;0<T$,!“e(B
unlocke$B$7$F$/$l$k$3$H$G<B$O$A$c$s$HF0$/$+$bCN$l$J$$$N$G!”<BMQE*$Je(B
lock validatore$B$N<BAu$,$`$D$+$7$$$H!#e(B

e$B$3$N$X$s$O1sF#$5$s$N$[$&$,@lLg$J$N$G!"$40U8+$$$?$@$1$k$H$"$j$,$?$$$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B1:24 Yusuke E. [email protected]:

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$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

e$B$J$K$+8e;OKv$,I,MW$J=hM}$,$"$k$H$7$^$9!#e(B
e$B$?$H$($P!"e(Bopen e$B$7$?$b$N$Oe(B close
e$B$7$J$$$H$$$1$J$$$H$7$F!"e(B
e$B0J2<$N%3!<%I$r9M$($^$9!#e(B

begin
f = open(filename)
ensure
f.close
end

e$B$3$3$G!"e(Bopen e$B$,=*N;$7$?8e!"e(Bf
e$B$KBeF~$9$kA0$K%3%s%F%-%9%H%9%$%C%A$,5/$3$k$He(B
e$B$I$&$G$7$g$&$+!#e(B
e$B%3%s%F%-%9%H%9%$%C%A$N7k2L!“B>$N%9%l%C%I$,F0$$$F!”>e5-$N%3!<%I$rF0$+$7$F$$$ke(B
e$B%9%l%C%I$re(B raise e$B$7$?$H$7$^$9!#e(B

e$B$=$&$9$k$H!"e(Bensure e$B@a$,<B9T$5$l$k$o$1$G$9$,!"e(Bclose
e$B$O$G$-$^$;$s!#e(B
e$B$J$s$G$+$H$$$&$H!"e(Bopen e$B$G@8@.$7$?e(B IO
e$B%*%V%8%'%/%H$,$I$3$K$be(B
e$B5-O?$5$l$F$$$J$$$+$i$G$9!#e(B

e$B$3$l$O>e5-$Ne(B Mutex#lock e$B$r;H$C$F$bKI$2$^$;$s!#e(B
e$B0l2s$7$+e(B Thread#raise e$B$7$F$$$J$$$+$i$G$9!#e(B

e$B$H$$$&$o$1$G!“e(Brescue/ensure e$B@a$NCf$GB>$+$ie(B raise
e$B$5$l$k$N$r$I$&$K$+$9$l$Pe(B
Thread#raise e$B$,0BA4$K$J$k!”$H$$$&$o$1$G$O$"$j$^$;$s!#e(B

e$B$A$J$$K$3$Ne(B race e$B$O%7%0%J%k$K$bB8:$7$^$9e(B

POSIX e$B%7%0%J%k$G$O!“<u$1IU$1$?%7%0%J%k$Oe(B signal handler
e$BFb$G%^%9%/$5$l$k$N$G!“e(B
handler
e$BFb$G:FEY$=$N%7%0%J%k$G3d$j9~$^$l$k!”$H$$$&?4G[$O$”$j$^$;$s!#e(B

e$B@NOC$H$7$F$O$=$&$G$O$J$+$C$?$b$N$b$“$C$?$h$&$G!”$=$Ne(B race
e$B$NOC$Oe(B
e$B8!:w$9$l$P=P$F$/$k$+$b$7$l$^$;$s!#e(B

e$B%A%1%C%He(B #3251 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

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

2010e$BG/e(B5e$B7ne(B6e$BF|e(B1:55 SASADA Koichi [email protected]:

e$B!!e(BPython e$B$O$J$<e(B Mutex e$B$rB>$+$i2rJ|$G$-$k$N$+!$$h$/$o$+$i$J$$$N$G$9$,!$e(B

snip

e$B$H$$$&$3$H$G!$e(BMutex e$B$H$$$&L>A0$@$H!$B>$+$i2rJ|=PMh$J$$!$$H$$$&%K%e%“%s%9e(B
e$B$,4^$^$l$F$k$s$8$c$J$$$+$J$!!$$H$$$&463P$,$”$j$^$9!%e(B

e$B$=$&$$$($Pe(B Python e$B$G$Oe(B Lock e$B$H$$$&L>A0$G$9!#e(B
e$B$h$/$o$+$j$^$;$s$,!“%^%K%e%”%k$r8+$k46$8e(B mutex
e$B$H$OL@3N$K6hJL$5$l$Fe(B
e$B$$$k$h$&$G$9!#$5$9$,e(B Python e$B@h@8!#e(B

e$BB>$N%7%9%F%`$@$H!$%;%^%U%)$,$"$k$+$i$$$$$8$c$s!$$H$$$&$3$H$J$N$+$b$7$le(B
e$B$:!$$8$c$!e(B Ruby e$B$K$b%;%^%U%)$rF~$l$J$$$H$$$1$J$$!$$H$$$&$3$H$+$b$7$l$^$;$s!%e(B

e$B$=$l$J$ie(B Semaphore e$B$r:n$j$^$7$g$&$+$M$(!#e(B
e$B$^$“!”=g=xIU$-e(B Map e$B$re(B Hash e$B$H8F$Ve(B Ruby
e$B$J$i:3:Y$JOC$G$O$J$$$+$H$$$&e(B
e$B5$$b$7$^$9$,!#e(B

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

semaphoee$B%;%^%s%F%#%/%9$@$He(BABBAe$B%G%C%I%m%C%/$r8!CN$7$F$bBh;0<T$,!“e(B
unlocke$B$7$F$/$l$k$3$H$G<B$O$A$c$s$HF0$/$+$bCN$l$J$$$N$G!”<BMQE*$Je(B
lock validatore$B$N<BAu$,$`$D$+$7$$$H!#e(B

e$BBh;0<T$Oe(B unlock e$B$O8F$Y$^$;$s$,!"e(BThread#raise e$B$de(B
Thread#kill e$B$r8F$Ve(B
e$B$3$H$,$G$-$k$N$G!“e(BABBA deadlock
e$B$+$iH4$1=P$;$k2DG=@-$,$”$j$^$9!#e(B
e$B62$m$7$$$3$H$K!#e(B

e$B$J$N$Ge(B Ruby e$B$Ne(B deadlock
e$B8!=P$O!“!V@8$-$F$$$kA4%9%l%C%I$,%m%C%/2rJ|e(B
e$BBT$A!”$^$?$OL54|8Be(B sleep
e$B$G5Y;_Cf!W$H$$$&!“Hs>o$KJ]<iE*$JH=Dj$G<BAue(B
e$B$5$l$F$^$9!#e(B1 e$B$D$G$b<B9TCf$N%9%l%C%I$,$”$k$J$ie(B deadlock
e$B$rJs9p$9$ke(B
e$B$3$H$O$"$j$^$;$s!#e(B


Yusuke E. [email protected]

http://redmine.ruby-lang.org/issues/show/3251

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

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

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
end
e$B$3$l$O>e5-$Ne(B Mutex#lock e$B$r;H$C$F$bKI$2$^$;$s!#e(B
e$B0l2s$7$+e(B Thread#raise e$B$7$F$$$J$$$+$i$G$9!#e(B

Thread.raise e$B$r<u$1IU$1$?$i$^$:$$4|4V$Oe(B mutex
e$B$r%m%C%/$7$F$*$1!"$H$$$&e(B
e$B$3$H$G2r7h$G$-$J$$$G$7$g$&$+!#e(B

Thread 1

begin
m.synchronize do
f = open(filename)
end
# …
ensure
f.close if f
m.unlock
end

Thread 2

m.lock
th.raise

e$B$A$J$$K$3$Ne(B race e$B$O%7%0%J%k$K$bB8:$7$^$9e(B

POSIX e$B%7%0%J%k$G$O!“<u$1IU$1$?%7%0%J%k$Oe(B signal handler e$BFb$G%^%9%/$5$l$k$N$G!“e(B
handler e$BFb$G:FEY$=$N%7%0%J%k$G3d$j9~$^$l$k!”$H$$$&?4G[$O$”$j$^$;$s!#e(B

e$B$$$(!"$=$&$$$&?4G[$G$O$J$$$G$9!#e(B
Ctrl+C e$B$rO"BG$7$?>l9g!"e(Bensure e$B$N<B9T3+;OD>8e$G$b$&0l2se(B
Interrupt e$B$,e(B
e$BH/@8$7$F$7$^$&$H!“e(Bensure
e$B@a$NCf?H$,<B9T$5$l$J$$2DG=@-$,$”$k$N$G$Oe(B
e$B$J$$$+$H$$$&?4G[$G$9!#e(B

e$B$A$c$s$H$O3NG’$7$F$J$$$N$G$9$,!"$R$g$C$H$7$?$i2?$+BP:v$5$l$F$$$k!)e(B

SIGINT e$B$,e(B Interrupt
e$BNc30$K<+F0JQ49$5$l$k$N$,LdBj$J$N$G!"e(Btrap(:INT) e$B$J$Ie(B
e$B$G<+NO$GBP:v$9$l$PLdBj$J$/$J$k$H;W$$$^$9!#e(B

e$B$H$3$m$G!"e(BRuby e$B%l%Y%k$Ne(B trap
e$B$,<B9TCf$K%7%0%J%k$r<u$1<h$C$?$i!“JL$Ne(B
trap e$B$r<B9T$7$F$7$^$&$3$H$,e(B (e$B$5$5$@$5$s$K$h$k$He(B)
e$B$”$k$i$7$$$N$G$9$,!"e(B
e$B$^$:$$$G$9$+$M!#e(B

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

Thread.raise e$B$r<u$1IU$1$?$i$^$:$$4|4V$Oe(B mutex e$B$r%m%C%/$7$F$*$1!"$H$$$&e(B
e$B$3$H$G2r7h$G$-$J$$$G$7$g$&$+!#e(B

e$B$G$O!"<!$Ke(B open e$B$,%V%m%C%/$9$k>l9g$r9M$($^$7$g$&!#e(B
e$B$?$H$($P!"e(Bfifo (named pipe) e$B$re(B open
e$B$9$k>l9g$,9M$($i$l$^$9!#e(B

e$B$=$&$9$k$H!"e(B

m.synchronize do
f = open(filename)
end

e$B$H$$$&ItJ,$N!"e(Bsycnchronize
e$B$NFbIt$G%V%m%C%/$9$k$3$H$K$J$j$^$9!#e(B
e$B$3$&$J$k$He(B open e$B$r30It$+$iCfCG$G$-$J$/$J$j$^$9!#e(B

e$B%V%m%C%/$7$F$7$^$C$?%9%l%C%I$rCfCG$7$?$$$H$$$&$N$O$"$j$,$A$JOC$G!"e(B
e$B$=$l$,$G$-$J$$$N$O$h$m$7$/$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

e$B$$$(!"$=$&$$$&?4G[$G$O$J$$$G$9!#e(B
Ctrl+C e$B$rO"BG$7$?>l9g!"e(Bensure e$B$N<B9T3+;OD>8e$G$b$&0l2se(B Interrupt e$B$,e(B
e$BH/@8$7$F$7$^$&$H!“e(Bensure e$B@a$NCf?H$,<B9T$5$l$J$$2DG=@-$,$”$k$N$G$Oe(B
e$B$J$$$+$H$$$&?4G[$G$9!#e(B

e$B$"$!!"e(BRuby e$B%l%Y%k$NOC$G$7$?$+!#e(BC
e$B%l%Y%k$NOC$H4*0c$$$7$^$7$?!#e(B

e$B$=$l$J$i$?$7$+$KF1MM$@$H;W$$$^$9!#e(B