我正在尝试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开始, 但是在几乎所有的运行中,订单都是随机的。为什么?
答案 0 :(得分:1)
您只是在线程完成休眠后更新count
,因此所有线程在进入休眠状态时都会读取count
的初始值,即0。
值得注意的是,以这种方式访问count
并非线程安全。
答案 1 :(得分:0)
订单是随机的,因为对象count
的访问不会在线程之间同步。
您正在遇到所谓的种族条件
当两个或多个线程可以访问共享数据并且他们尝试同时更改它时,就会出现竞争条件。
您可以通过在ruby中使用互斥锁,条件变量和队列对象来停止此操作。
编辑:另外,请参阅Jeremy的回答