# Thread leak?

**URL:** <https://rubytalk.org/t/thread-leak/21542>\
**Category:** ruby-talk\
**Created:** [13 October 2005 17:16 UTC](https://rubytalk.org/t/thread-leak/21542 "2005-10-13T17:16:15Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Adam\_Beguelin](https://avatars.discourse-cdn.com/v4/letter/a/2acd7d/32.png) [@Adam\_Beguelin](https://rubytalk.org/u/Adam_Beguelin)\
**Post date:** [13 October 2005 17:16 UTC](https://rubytalk.org/t/thread-leak/21542/1 "2005-10-13T17:16:15Z")

</div>

The following code seems to leak threads. Is there a better way to handle  
timeouts so they don't leak threads? I tested it on both windows and linux  
and the results are the same.

If you set t to nil in the rescue the result is the same.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Adam

require 'timeout'

include ObjectSpace

begin

&nbsp;&nbsp;execLine = "sleep 100"

&nbsp;&nbsp;while true do

&nbsp;&nbsp;&nbsp;&nbsp;t = Thread.new {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e = IO.popen(execLine)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.readlines

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ensure

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.close if (e && !e.closed?)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout(1) { t.join }

&nbsp;&nbsp;&nbsp;&nbsp;rescue TimeoutError =\> e

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts "timeout: "+e.to\_s

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.kill

&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;c = 0

&nbsp;&nbsp;&nbsp;&nbsp;ObjectSpace.garbage\_collect

&nbsp;&nbsp;&nbsp;&nbsp;ObjectSpace.each\_object{|t| c += 1 if t.class == Thread}

&nbsp;&nbsp;&nbsp;&nbsp;puts "num threads #{c}"

&nbsp;&nbsp;&nbsp;&nbsp;break if c \> 20

&nbsp;&nbsp;end

end

---

<div class="post-metadata">

**Author:** ![Nakada\_Nobuyoshi](https://avatars.discourse-cdn.com/v4/letter/n/848f3c/32.png) [@Nakada\_Nobuyoshi](https://rubytalk.org/u/Nakada_Nobuyoshi)\
**Post date:** [14 October 2005 02:26 UTC](https://rubytalk.org/t/thread-leak/21542/2 "2005-10-14T02:26:25Z")

</div>

Hi,

At Fri, 14 Oct 2005 02:16:15 +0900,  
Adam Beguelin wrote in [ruby-talk:160449]:

> begin  
> &nbsp;&nbsp;execLine = "sleep 100"  
> &nbsp;&nbsp;while true do  
> &nbsp;&nbsp;&nbsp;&nbsp;t = Thread.new {  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e = IO.popen(execLine)  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.readlines  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ensure

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if e && !e.closed?  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process.kill(e.pid)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.close  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

> **···**
>
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> > &nbsp;&nbsp;&nbsp;&nbsp;}  
> > &nbsp;&nbsp;&nbsp;&nbsp;  
> > &nbsp;&nbsp;&nbsp;&nbsp;begin  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout(1) { t.join }  
> > &nbsp;&nbsp;&nbsp;&nbsp;rescue TimeoutError =\> e  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts "timeout: "+e.to\_s  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.kill  
> > &nbsp;&nbsp;&nbsp;&nbsp;end  
> > &nbsp;&nbsp;&nbsp;&nbsp;c = 0  
> > &nbsp;&nbsp;&nbsp;&nbsp;ObjectSpace.garbage\_collect  
> > &nbsp;&nbsp;&nbsp;&nbsp;ObjectSpace.each\_object{|t| c += 1 if t.class == Thread}  
> > &nbsp;&nbsp;&nbsp;&nbsp;puts "num threads #{c}"  
> > &nbsp;&nbsp;&nbsp;&nbsp;break if c \> 20  
> > &nbsp;&nbsp;end  
> > end
> 
> --  
> Nobu Nakada
