# Queue and timeout

**URL:** <https://www.ruby-forum.com/t/queue-and-timeout/125156>\
**Category:** Development\
**Created:** [January 6, 2008, 11:23am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156 "2008-01-06T11:23:19Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 6, 2008, 11:23am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/1 "2008-01-06T11:23:19Z")

</div>

timeout e$B$Ge(B Queue#pop e$B$K;~4V@)8B$r$D$1$?;~!“%?%$%`%”%&%H;~$Ke(B  
Timeout::Error e$B$G$J$/e(B ThreadError e$B$,H/@8$7$^$9!#e(B

% ./ruby -v -rtimeout -rthread -e ’  
q = Queue.new  
timeout(1) { q.pop }  
’  
ruby 1.9.0 (2008-01-06 revision 0) [i686-linux]  
prelude.rb:10:in `unlock': Attempt to unlock a mutex which is locked by another thread (ThreadError) from prelude.rb:10:in `ensure in synchronize’  
from prelude.rb:10:in `synchronize' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/thread.rb:181:in `pop’  
from -e:3:in `block in <main>' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:46:in `timeout’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:65:in  
`timeout' from -e:3:in `’  
zsh: exit 1 ./ruby -v -rtimeout -rthread -e ’ q = Queue.new  
timeout(1) { q.pop } ’

1.8 e$B$G$Oe(B Timeout::Error e$B$G$7$?!#e(B

% ruby-1.8 -v -rtimeout -rthread -e ’  
q = Queue.new  
timeout(1) { q.pop }  
’  
ruby 1.8.6 (2007-12-14 patchlevel 5000) [i686-linux]  
/home/akr/ruby/18/lib/ruby/1.8/timeout.rb:54: execution expired  
(Timeout::Error)  
from /home/akr/ruby/18/lib/ruby/1.8/timeout.rb:56:in `timeout' from /home/akr/ruby/18/lib/ruby/1.8/timeout.rb:76:in `timeout’  
from -e:3

e$B$\*$=$i$/$3$l$N$;$$$G!"e(Bresolv e$B$,$&$^$/F0$-$^$;$s!#e(B

% ./ruby -v -rresolv -e ’  
ts = (1…10).map { Thread.new { p Resolv.getaddress(“[www.rubyist.net](http://www.rubyist.net)”) }  
}  
ts.each {|t| t.join }  
’  
ruby 1.9.0 (2008-01-06 revision 0) [i686-linux]  
“221.186.184.67”  
“221.186.184.67”  
“221.186.184.67”  
prelude.rb:10:in `unlock': Attempt to unlock a mutex which is locked by another thread (ThreadError) from prelude.rb:10:in `ensure in synchronize’  
from prelude.rb:10:in `synchronize' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/thread.rb:181:in `pop’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:495:in  
`block (2 levels) in each_resource' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:46:in `timeout’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:65:in  
`timeout' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:495:in `block in each\_resource’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:891:in  
`block (3 levels) in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:889:in `each’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:889:in  
`block (2 levels) in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:888:in `each’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:888:in  
`block in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:886:in `each’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:886:in  
`resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:485:in `each\_resource’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:390:in  
`each_address' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:110:in `block in each\_address’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:109:in  
`each' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:109:in `each\_address’  
from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:87:in  
`getaddress' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:38:in `getaddress’  
from -e:2:in `block (2 levels) in ’

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 9, 2008, 6:52pm UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/2 "2008-01-09T18:52:49Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32935] queue and timeout”  
on Sun, 6 Jan 2008 19:22:19 +0900, Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|timeout e$B$Ge(B Queue#pop e$B$K;~4V@)8B$r$D$1$?;~!“%?%$%`%”%&%H;~$Ke(B  
|Timeout::Error e$B$G$J$/e(B ThreadError e$B$,H/@8$7$^$9!#e(B

e$BDI$$$+$1$F$\_$^$7$?!#e(B

- 

Queue#pope$B$,e(BMutex#synchronizee$B$N%V%m%C%/Cf$Ge(BMutex#sleepe$B$r8F$Ve(B

- Mutex#sleepe$B$,e(Brb\_mutex\_unlock()e$B$r8F$Ve(B
- e$B$3$3$Ge(BTimeout
- 

Mutex#synchronizee$B$,CfCG!#e(Bensuree$B$Ge(BMutex#unlocke$B$,8F$P$l$ke(B

- e$B$9$G$Ke(Bunlocke$B$5$l$F$$$k$N$Ge(BThreadErrore$BNc30e(B
- Timeout::Errore$BNc30$OL5;k$5$l$A$c$&e(B

e$B$H$$$&N.$l$N$h$&$G$9!#$A$g$C$H9M$($k$He(B

- Mutex#sleepe$B$Oe(Bmutex-\>the$B$r%/%j%"$7$J$$e(B
- Mutex#unlocke$B$Oe(Bmutex-\>th==0e$B$N;~Nc30$r5/$3$5$J$$e(B

e$B$J$I$NBP1~$,9M$($i$l$^$9$,!"I{:nMQ$,5$$K$J$j$^$9!#e(B

```
                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

```

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 9:45am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/3 "2008-01-10T09:45:09Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

At Thu, 10 Jan 2008 02:51:11 +0900,  
Yukihiro M. wrote:

> e$B$H$$$&N.$l$N$h$&$G$9!#$A$g$C$H9M$($k$He(B
> 
> - Mutex#sleepe$B$Oe(Bmutex-\>the$B$r%/%j%"$7$J$$e(B
> - Mutex#unlocke$B$Oe(Bmutex-\>th==0e$B$N;~Nc30$r5/$3$5$J$$e(B
> 
> e$B$J$I$NBP1~$,9M$($i$l$^$9$,!"I{:nMQ$,5$$K$J$j$^$9!#e(B

e$BF1$8$/$A$g$C$H9M$($?$@$1$G$9$,!"e(BMutex#sleepe$B$Ge(BMutexe$B$r2rJ|$7$J$$$He(B  
Queue#pushe$B$,$G$-$J$$$N$G$O$J$$$G$7$g$&$+e(B?

Mutex#unlocke$B$NJQ$o$j$KNc30$r5/$3$5$J$$e(BMutex#try\_unlocke$B$rDI2C$7$Fe(B  
e$B;H$&$H$$$&$N$O$I$&$G$7$g$&$+e(B?

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 9:55am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/4 "2008-01-10T09:55:42Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33004] Re: queue and timeout”  
on Thu, 10 Jan 2008 17:44:13 +0900, Kazuhiro NISHIYAMA  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|\> \* Queue#pope$B$,e(BMutex#synchronizee$B$N%V%m%C%/Cf$Ge(BMutex#sleepe$B$r8F$Ve(B  
|\> \* Mutex#sleepe$B$,e(Brb\_mutex\_unlock()e$B$r8F$Ve(B  
|\> \* e$B$3$3$Ge(BTimeout  
|\> \* Mutex#synchronizee$B$,CfCG!#e(Bensuree$B$Ge(BMutex#unlocke$B$,8F$P$l$ke(B  
|\> \* e$B$9$G$Ke(Bunlocke$B$5$l$F$$$k$N$Ge(BThreadErrore$BNc30e(B  
|\> \* Timeout::Errore$BNc30$OL5;k$5$l$A$c$&e(B  
|\>  
|\> e$B$H$$$&N.$l$N$h$&$G$9!#$A$g$C$H9M$($k$He(B  
|\>  
|\> \* Mutex#sleepe$B$Oe(Bmutex-\>the$B$r%/%j%"$7$J$$e(B  
|\> \* Mutex#unlocke$B$Oe(Bmutex-\>th==0e$B$N;~Nc30$r5/$3$5$J$$e(B  
|\>  
|\> e$B$J$I$NBP1~$,9M$($i$l$^$9$,!"I{:nMQ$,5$$K$J$j$^$9!#e(B  
|  
|e$BF1$8$/$A$g$C$H9M$($?$@$1$G$9$,!"e(BMutex#sleepe$B$Ge(BMutexe$B$r2rJ|$7$J$$$He(B  
|Queue#pushe$B$,$G$-$J$$$N$G$O$J$$$G$7$g$&$+e(B?

e$B$$$d!"e(BMutex#sleepe$B$Ge(BMutexe$B$O2rJ|$9$k$s$G$9$h!#$?$@!“e(Bmutex-\>th  
e$B$re(B0e$B%/%j%”$7$J$$$H$$$&$@$1$G!#e(B

|Mutex#unlocke$B$NJQ$o$j$KNc30$r5/$3$5$J$$e(BMutex#try\_unlocke$B$rDI2C$7$Fe(B  
|e$B;H$&$H$$$&$N$O$I$&$G$7$g$&$+e(B?

e$B$=$C$A$,$$$$$N$+$J$“!#$”$k$$$Oe(B unlock e$B$Ke(B rescue  
e$B$rIU$1$A$c$&e(B  
e$B$+!#$?$@!"JBNs%W%m%0%i%\_%s%0AG?M$N;d$,\<j$r=P$9$H$d$1$I$7$A$ce(B  
e$B$$$=$&!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 11:45am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/5 "2008-01-10T11:45:17Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> e$BK\Mh%(%i!\<$K$J$k$Y$-$H$3$m$,$o$+$i$J$/$J$k$N$,LdBj$+$b$H;W$$$^$7e(B  
> e$B$?$,!"e(BIO#opene$B$J$s$+$bF1$8$3$H$J$N$G$$$$$s$8$c$J$$$G$7$g$&$+!#e(B-d  
> e$B%\*%W%7%g%s$D$-$N$H$-$K$&$k$5$/$J$$$H$$$&E@$G$O!"e(Btry\_unlocke$B$N$[$&e(B  
> e$B$,$$$$$+$b$7$l$^$;$s$,!#e(B

e$B$=$l$O$=$l$H$7$F$b$C$H:,K\E\*$K$O!"e(Btimeout e$B$D$-$Ne(B pop  
e$B$rDI2Ce(B  
e$B$9$k$N$,$$$$$h$&$J5$$,$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 11:37am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/6 "2008-01-10T11:37:38Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 10 Jan 2008 17:54:47 +0900,  
Yukihiro M. wrote in [ruby-dev:33005]:

> |e$BF1$8$/$A$g$C$H9M$($?$@$1$G$9$,!"e(BMutex#sleepe$B$Ge(BMutexe$B$r2rJ|$7$J$$$He(B  
> |Queue#pushe$B$,$G$-$J$$$N$G$O$J$$$G$7$g$&$+e(B?
> 
> e$B$$$d!"e(BMutex#sleepe$B$Ge(BMutexe$B$O2rJ|$9$k$s$G$9$h!#$?$@!“e(Bmutex-\>th  
> e$B$re(B0e$B%/%j%”$7$J$$$H$$$&$@$1$G!#e(B

e$B$$$d!“e(Bmutex-\>the$B$re(B0e$B%/%j%”$9$k$3$H$Ge(BMutexe$B$,2rJ|$5$l$?$3$H$K$J$k$Ne(B  
e$B$G$O!#e(B

> |Mutex#unlocke$B$NJQ$o$j$KNc30$r5/$3$5$J$$e(BMutex#try\_unlocke$B$rDI2C$7$Fe(B  
> |e$B;H$&$H$$$&$N$O$I$&$G$7$g$&$+e(B?
> 
> e$B$=$C$A$,$$$$$N$+$J$"!#$"$k$$$Oe(B unlock e$B$Ke(B rescue e$B$rIU$1$A$c$&e(B  
> e$B$+!#$?$@!"JBNs%W%m%0%i%\_%s%0AG?M$N;d$,\<j$r=P$9$H$d$1$I$7$A$ce(B  
> e$B$$$=$&!#e(B

e$BK\Mh%(%i!\<$K$J$k$Y$-$H$3$m$,$o$+$i$J$/$J$k$N$,LdBj$+$b$H;W$$$^$7e(B  
e$B$?$,!"e(BIO#opene$B$J$s$+$bF1$8$3$H$J$N$G$$$$$s$8$c$J$$$G$7$g$&$+!#e(B-d  
e$B%\*%W%7%g%s$D$-$N$H$-$K$&$k$5$/$J$$$H$$$&E@$G$O!"e(Btry\_unlocke$B$N$[$&e(B  
e$B$,$$$$$+$b$7$l$^$;$s$,!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 12:20pm UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/7 "2008-01-10T12:20:27Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 10 Jan 2008 19:47:26 +0900,  
Yukihiro M. wrote in [ruby-dev:33008]:

> |\> e$B$$$d!"e(BMutex#sleepe$B$Ge(BMutexe$B$O2rJ|$9$k$s$G$9$h!#$?$@!“e(Bmutex-\>th  
> |\> e$B$re(B0e$B%/%j%”$7$J$$$H$$$&$@$1$G!#e(B  
> |  
> |e$B$$$d!“e(Bmutex-\>the$B$re(B0e$B%/%j%”$9$k$3$H$Ge(BMutexe$B$,2rJ|$5$l$?$3$H$K$J$k$Ne(B  
> |e$B$G$O!#e(B
> 
> e$B$$$^$$$Ae(B pthread e$B%W%m%0%i%\_%s%0$K47$l$F$$$J$$$s$G$9$,!“e(B  
> mutex-\>th e$B$,%/%j%”$5$l$F$J$/$F$b!"e(Bnative\_mutex\_unlock()e$B$,8Fe(B  
> e$B$P$l$l$P2rJ|$5$l$?$3$H$K$J$k$s$G$O$J$$$+$H!#e(B

pthread\_mutex\_te$B$Oe(Bcancelablee$B$G$J$$$N$G!“e(BMutexe$B$G$OD\>@;H$C$F$O$$$^e(B  
e$B$;$s!#e(Brb\_mutex\_unlock()e$B$G%m%C%/e(B/e$B%”%s%m%C%/$7$F$$$k$N$O!"e(Bmutex\_t  
e$B\<+BN$KBP$9$kGSB\>@)8f$@$1$G$9!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 12:43pm UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/8 "2008-01-10T12:43:59Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

e$B$=$b$=$bC/$b%m%C%/$7$F$J$$e(B Mutex e$B$re(B unlock  
e$B$7$h$&$H$7$?$H$-$Ke(B  
Attempt to unlock a mutex which is locked by another thread  
e$B$H=P$k$N$OIT?F@Z$G$O$J$$$G$7$g$&$+!#CN$i$J$$$H$O$^$j$=$&$G$9!#e(B

# Index: thread.c

— thread.c (revision 14978)  
+++ thread.c (working copy)  
@@ -2362,22 +2362,30 @@  
rb\_mutex\_unlock(VALUE self)  
{  
mutex\_t \*mutex;

- char \*err = NULL;  
GetMutexPtr(self, mutex);

- if (mutex-\>th != GET\_THREAD()) {
- rb\_raise(rb\_eThreadError,
- 

```
"Attempt to unlock a mutex which is locked by another thread");

```

- native\_mutex\_lock(&mutex-\>lock);
- 
- if (mutex-\>th == 0) {
- err = “Attempt to unlock a mutex which is not locked”;  
}
- else if (mutex-\>th != GET\_THREAD()) {
- err = “Attempt to unlock a mutex which is locked by another thread”;
- }
- else {
- mutex-\>th = 0;
- if (mutex-\>cond\_waiting \> 0) {
- 

```
 /* waiting thread */

```

- 

```
 native_cond_signal(&mutex->cond);

```

- 

```
 mutex->cond_waiting--;

```

- }
- }

- native\_mutex\_lock(&mutex-\>lock);
- mutex-\>th = 0;
- if (mutex-\>cond\_waiting \> 0) {
- /\* waiting thread \*/
- native\_cond\_signal(&mutex-\>cond);
- mutex-\>cond\_waiting–;
- }  
native\_mutex\_unlock(&mutex-\>lock);

- if (err) rb\_raise(rb\_eThreadError, err);
- return self;  
}

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 10, 2008, 11:48am UTC](https://www.ruby-forum.com/t/queue-and-timeout/125156/9 "2008-01-10T11:48:13Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33006] Re: queue and timeout”  
on Thu, 10 Jan 2008 19:35:48 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|\> e$B$$$d!"e(BMutex#sleepe$B$Ge(BMutexe$B$O2rJ|$9$k$s$G$9$h!#$?$@!“e(Bmutex-\>th  
|\> e$B$re(B0e$B%/%j%”$7$J$$$H$$$&$@$1$G!#e(B  
|  
|e$B$$$d!“e(Bmutex-\>the$B$re(B0e$B%/%j%”$9$k$3$H$Ge(BMutexe$B$,2rJ|$5$l$?$3$H$K$J$k$Ne(B  
|e$B$G$O!#e(B

e$B$$$^$$$Ae(B pthread e$B%W%m%0%i%\_%s%0$K47$l$F$$$J$$$s$G$9$,!“e(B  
mutex-\>th e$B$,%/%j%”$5$l$F$J$/$F$b!"e(Bnative\_mutex\_unlock()e$B$,8Fe(B  
e$B$P$l$l$P2rJ|$5$l$?$3$H$K$J$k$s$G$O$J$$$+$H!#e(B

|\> e$B$=$C$A$,$$$$$N$+$J$“!#$”$k$$$Oe(B unlock e$B$Ke(B rescue e$B$rIU$1$A$c$&e(B  
|\> e$B$+!#$?$@!"JBNs%W%m%0%i%\_%s%0AG?M$N;d$,\<j$r=P$9$H$d$1$I$7$A$ce(B  
|\> e$B$$$=$&!#e(B  
|  
|e$BK\Mh%(%i!\<$K$J$k$Y$-$H$3$m$,$o$+$i$J$/$J$k$N$,LdBj$+$b$H;W$$$^$7e(B  
|e$B$?$,!"e(BIO#opene$B$J$s$+$bF1$8$3$H$J$N$G$$$$$s$8$c$J$$$G$7$g$&$+!#e(B-d  
|e$B%\*%W%7%g%s$D$-$N$H$-$K$&$k$5$/$J$$$H$$$&E@$G$O!"e(Btry\_unlocke$B$N$[$&e(B  
|e$B$,$$$$$+$b$7$l$^$;$s$,!#e(B

e$B$H$j$“$($:e(B rescue e$BIU$1$H$-$^$7$?!#ITK~$,$”$l$P!"$5$5$@$/$se(B  
(e$B!)e(B)e$B$,D\>$7$F$/$l$k$G$7$g$&!#e(B
