Aren't ruby Queues thread safe why is the queue not synchronizing?

Viewed 821

I am trying to create many threads and return the result in a data structure and I read that Queue is thread-safe, but when I run the code it doesn't produce the expected result.

require 'thread'

class ThreadsTest
  queue = Queue.new
  threads = []
  for i in 1..10
    threads << Thread.new do 
      queue << i
    end
  end

  threads.each { |t| t.join }

  for i in 1..10
    puts queue.pop()
  end
end

The code prints: (always a little different)

4
4
4
4
10
10
10
10
10
10

I was expecting the numbers 1 through 10.

I have tried to synchronize it manually to no avail:

  mutex = Mutex.new
  for i in 1..10
    threads << Thread.new do 
      mutex.synchronize do
        queue << i
      end
    end
  end

What am I missing?

1 Answers
Related