多线程 + Ruby 数组

Sas*_*ash 1 ruby arrays multithreading

我发现很难理解在 Ruby 中使用多个线程插入数组是否安全。

据我了解 Ruby 数组,就像任何其他对象一样不是线程安全的。但这是否意味着插入数组也不安全?

例如,我有以下代码:

arr=[]
threads = []

for i in 1..5
    threads << Thread.new do
        for j in 1..1000
            arr << ((1000 * i) + j)
        end
    end
end

threads.each(&:join)

puts arr.length
Run Code Online (Sandbox Code Playgroud)

它只旋转 5 个线程,每个线程将 1000 个数字推送到数组中。看起来结果总是一致的,我总是得到数组中 5000 个元素的结果。

那么这样做安全吗?

小智 6

据我了解 Ruby 数组,就像任何其他对象一样不是线程安全的。但这是否意味着插入数组也不安全?

正确的。数组插入在 Ruby 上并不安全,但如果你在 MRI 中运行你的代码,它每次都会工作,因为 GIL。GIL(全局解释器锁)是为了防止此类问题而创建的,但是 JRuby 和 Rubinius 没有 GIL,并且按您的预期工作(有时会产生 5000 个,有时会更少)。

这是因为使用 GIL 时只有一个线程处于活动状态,因此向数组添加元素是没有问题的。

读这个。