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

**URL:** <https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099>\
**Category:** Development\
**Created:** [May 5, 2010, 6:24pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099 "2010-05-05T18:24:21Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 5, 2010, 6:24pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/1 "2010-05-05T18:24:21Z")

</div>

Feature #3251: allow to unlock mutex locked by another thread  
[http://redmine.ruby-lang.org/issues/show/3251](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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 5, 2010, 6:55pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/2 "2010-05-05T18:55:59Z")

</div>

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

> **[ミューテックス](https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%86%E3%83%83%E3%82%AF%E3%82%B9)**
>
> ミューテックス (英: mutex) とは、コンピュータプログラミングにおける技術用語。クリティカルセクションでアトミック性を確保するための排他制御や同期機構の一種である。「mutex」という語は「mutual exclusion」 (相互排他、排他制御) の省略形である。ここでは、狭義の排他制御について述べる。
> セマフォをクリティカルセクションの排他制御に用いる時、セマフォでは（初期値が1でなければ）複数のタスクがクリティカルセクションに入ることを許可するのに対し、ミューテックスでは同時に一つのタスクのみがクリティカルセクションに入ることを許可する（ここで言うタスクとは、スレッドまたはプロセスを指す）。挙動はセマフォ変数の初期値を1にする事と等価。このようなタスク優先度とリンクしないミューテックスを、バイナリセマフォと呼ぶ場合もある。
> 狭義には、ミューテックスの場合にそれをロック（P操作）したタスクのみがアンロック（V操作）できるのに対して、セマフォではその様な制約はない。また、ミューテックスには、優先度逆転を防止するための優先度継承 (Priority Inheritance) ...

> 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

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 6, 2010, 10:10am UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/3 "2010-05-06T10:10:19Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 6, 2010, 1:03pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/4 "2010-05-06T13:03:00Z")

</div>

2010e$BG/e(B5e$B7ne(B6e$BF|e(B1:24 Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 6, 2010, 1:07pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/5 "2010-05-06T13:07:41Z")

</div>

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 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

[http://redmine.ruby-lang.org/issues/show/3251](http://redmine.ruby-lang.org/issues/show/3251)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 6, 2010, 1:20pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/6 "2010-05-06T13:20:34Z")

</div>

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

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:02 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

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

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [May 6, 2010, 1:48pm UTC](https://www.ruby-forum.com/t/feature-3251-allow-to-unlock-mutex-locked-by-another-thread/188099/7 "2010-05-06T13:48:04Z")

</div>

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:20 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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
