On Oct 29, 2004, at 12:33 PM, Ara.T.Howard / noaa.gov wrote:

> On Sat, 30 Oct 2004, Eric Hodel wrote:
>
>> On Oct 28, 2004, at 9:53 PM, Ara.T.Howard wrote:
>>
>>> i have a program i'd like to exit gracefully on certain signals.  the
>>> code spawns many threads which are never joined.  however, when
>>> signaled i want to finished and pending threads before exiting -
>>> something like
>>>
>>>   if $signaled
>>>     Thread::list.each do |t|
>>>       next if Thread::current == t
>>>       begin
>>>         t.join
>>>       rescue => e
>>>         warn{ e }
>>>       end
>>>     end
>>>   end
>>>
>>> i'm wondering:
>>>
>>> if i spawn threads and never join them - will Thread::list grow
>>> without bound?
>>>
>>> are there any issues with iterating Thread::list - since this list is
>>> obviously changing all the time in this code (new Threads started)
>>
>> Have you seen the ThreadGroup class?  A thread can only live in one
>> ThreadGroup, so you can create a ThreadGroup for spawned threads, add
>> the spawned threads to that ThreadGroup, then walk the ThreadGroup's
>> list on shutdown.  This way you don't have to worry about killing
>> Thread.current
>
> i did look at that - however i'm worried that having a reference to 
> the thread
> will maintain a reference that will keep it from getting GC'd.  see, i
> normally simply spawn the threads and forget about them - it's only for
> catching signals that i need to shut down any running threads.  does 
> the above
> sound accurate?

ThreadGroups allow you to do that:

$ ruby
t = Thread.new { sleep 4 }
tg = ThreadGroup.new
tg.add t
p tg.list
sleep 10
p tg.list
[#<Thread:0x1cb878 sleep>]
[]