As we described in the previous section, a thread can normally access
any variables that are in scope when the thread is created. Variables
local to the block of a thread are local to the thread, and are not
shared.
But what if you need per-thread variables that can be accessed by
other threads---including the main thread?
Thread
features a
special facility that allows thread-local variables to be created and
accessed by name. You simply treat the thread object as if it were a
Hash
, writing to elements using
[]=
and reading them back
using
[]
. In this example, each thread records the current
value of the variable
count
in a thread-local variable with the
key
mycount
. (There's a race condition in this code, but we haven't
talked about synchronization yet, so we'll just quietly ignore it for now.)
count = 0
arr = []
10.times do |i|
arr[i] = Thread.new {
sleep(rand(0)/10.0)
Thread.current["mycount"] = count
count += 1
}
end
arr.each {|t| t.join; print t["mycount"], ", " }
puts "count = #{count}"
|
produces:
8, 0, 3, 7, 2, 1, 6, 5, 4, 9, count = 10
|
The main thread waits for the subthreads to finish and then prints
out the value of
count
captured by each. Just to make it more
interesting, we have each thread wait a random time before recording
the value.