ruby - 为什么 Ruby 中对数组的 << 操作不是原子的?

标签 ruby multithreading thread-safety atomic

在 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/

相关文章:

c# - 用 ReaderWriterLockSLim 替换 ReaderWriterLock - 麻烦

python - 线程提示是串行运行,而不是并行运行?

java - DocumentBuilder.parse() 线程安全吗?

java线程通信,独立文件读写

windows-vista - 在Windows Vista中,线程计划程序在哪个IRQL上运行?

c - 多线程应用程序中的 __attribute__((constructor)) && __attribute__((destructor))

ruby-on-rails - Rails 4 - 未使用的预加载。为什么?

ruby - 如何测试法拉第的响应?

c - 使用 ruby​​ - 反对 cp 命令复制文件的速度有多快?

Ruby - 检查 if block_given 之间有什么区别?和!block.nil?