From: "Jesús Gabriel y Galán" Date: 2010-07-07T01:15:21+09:00 Subject: Re: Problem of share variable in function using thread On Tue, Jul 6, 2010 at 6:00 PM, Nita Neou wrote: > Hi All > > I got a little problem when using thread function and variable, let's > say this code : > > require 'rubygems' > require 'watir' > require 'thread' > > def testfunc(id) >        total = id + 5 >        puts "id #{id} is #{total}" > end > > threads = [] > numberlist = [1, 2, 3] > for id in numberlist >        threads << Thread.new {testfunc(id)} > end > > threads.each { |aThread|  aThread.join } > > my output is : > [sophoah@fedora ]$ ruby test.rb > id 3 is 8 > id 3 is 8 > id 3 is 8 > > The fact is that I would like this output : > id 1 is 6 > id 2 is 7 > id 3 is 8 > > I am suspecting that all variable id, and total are all share among > all the thread, is that right ? why ? I thought variable in a block > were not share among variable ? How can I fix this problem ? Blocks in Ruby are closures, this means that inside the block you pass to Thread.new, the variable id is the same. The Thread class has a way to avoid this, take a look at the constructor: http://ruby-doc.org/core/classes/Thread.html#M000437 You can pass parameters to #new and it will pass them to the block. You can use this technique to use a variable in the block that is different for each thread, like this: def testfunc(id) total = id + 5 puts "id #{id} is #{total}" end threads = [] numberlist = [1, 2, 3] for id in numberlist threads << Thread.new(id) {|my_id| testfunc(my_id)} end threads.each { |aThread| aThread.join } $ ruby threads.rb id 1 is 6 id 2 is 7 id 3 is 8 Jesus.