Issue #5788 has been updated by Nobuyoshi Nakada.


=begin
Calling (({rb_gc_mark()})) only once at the hook definition makes no sense.
You have to mark it in (({rb_thread_mark()})).
=end

----------------------------------------
Feature #5788: Thread#at_exit
https://bugs.ruby-lang.org/issues/5788

Author: Masaki Matsushita
Status: Feedback
Priority: Normal
Assignee: 
Category: core
Target version: 


=begin
I propose a new method Thread#at_exit.
It is to register a block which will be called when the thread ends.

 p Thread.main #=> #<Thread:0x007f828fa97fe0 run>
 p t = Thread.new{ # do something } #=> #<Thread:0x007f828fc9e500 run>
 t.at_exit{ p Thread.current }
 t.join #=> #<Thread:0x007f828fc9e500 run>
 
Thread.main.at_exit is equal to Kernel.at_exit.

I think this method is useful for waiting plural running threads end.

Without Thread#at_exit:
 t1 = Thread.new{ sleep 1 }
 t2 = Thread.new{ sleep 2 }
 
 [t1, t2].each do |t|
   Thread.new do
     t.join
     puts "Thread ended!"
   end
 end

 [t1, t2].each(&:join)

To handle threads' end immediately, the same number of threads as ones to wait is needed.

For example, Ruby's standard library thwait.rb does so.

With Thread#at_exit:
 t1 = Thread.new{ sleep 1 }
 t2 = Thread.new{ sleep 2 }

 [t1, t2].each do |t|
   # It runs when interpreter ends.
   t.at_exit{ puts "Thread ended!" }
 end

New threads are not necessary.

I made a patch.
Patched ruby passes test-all.
=end



-- 
http://redmine.ruby-lang.org