睡眠和线程(Ruby)

时间:2014-02-27 02:48:37

标签: ruby multithreading

我正在尝试Ruby中的线程示例中的以下代码:

count = 0
arr = []

10.times do |i|
  arr[i] = Thread.new {
  sleep(count*10)
  Thread.current["mycount"] = count
  count += 1
}
end

arr.each {|t| t.join; print t["mycount"], ", " }
puts "count = #{count}"

因为我增加了每个线程的睡眠时间,所以我希望输出从1-10开始, 但是在几乎所有的运行中,订单都是随机的。为什么?

2 个答案:

答案 0 :(得分:1)

您只是在线程完成休眠后更新count,因此所有线程在进入休眠状态时都会读取count的初始值,即0。

值得注意的是,以这种方式访问​​count并非线程安全。

答案 1 :(得分:0)

订单是随机的,因为对象count的访问不会在线程之间同步。

您正在遇到所谓的种族条件

  

当两个或多个线程可以访问共享数据并且他们尝试同时更改它时,就会出现竞争条件。

您可以通过在ruby中使用互斥锁,条件变量和队列对象来停止此操作。

编辑:另外,请参阅Jeremy的回答