在 Ruby 中,如果 array
,则此代码不是线程安全的被多个线程修改:
array = []
array << :foo # many threads can run this code
为什么是<<
操作不是线程安全的?
最佳答案
实际上使用 MRI(Matz 的 Ruby 实现)GIL(全局解释器锁)使任何纯 C 函数成为原子。
自 Array#<<
在 MRI 中作为纯 C 代码实现,此操作将是原子的。但请注意,这仅适用于 MRI。在 JRuby 上,情况并非如此。
为了完全理解发生了什么,我建议您阅读这两篇文章,它们很好地解释了一切:
Nobody Understands the GIL
Nobody Understands the GIL - part 2
关于ruby - 为什么 Ruby 中对数组的 << 操作不是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765102/