Ruby threads and variable

multithreading, ruby, thread-safety

Solution

The block that is passed to `Thread.new` may actually begin at some point in the future, and by that time the value of `i` may have changed. In your case, they all have incremented up to `10` prior to when all the threads actually run.

To fix this, use the form of `Thread.new` that accepts a parameter, in addition to the block:

require 'thread'

def run(i)
  puts i
end

while true
  for i in 0..10
    Thread.new(i) { |j| run(j) }
  end
  sleep(100)
end

This sets the block variable `j` to the value of `i` at the time `new` was called.

Problem

Why the result is not from 1 to 10, but 10s only? ``` require 'thread' def run(i) puts i end while true for i in 0..10 Thread.new{ run(i)} end sleep(100) end ``` Result: ``` 10 10 10 10 10 10 10 10 10 10 10 ``` Why loop? I am running while loop, because later I want to iterate through the DB table all the time and echo any records that are retrieved from the DB.

Original source