根据过去在C#和Java中的工作,我习惯于这样的声明,例如,它不是线程安全的:

x += y;

但是,当与Ruby并行运行以上代码时,我无法观察到线程之间的任何冲突。

我已经读过Ruby automatically prevents multiple threads from writing to the same data concurrently。这是真的?因此+=运算符是否在Ruby中是线程安全的?

最佳答案

好吧,这取决于您的实现和很多事情。在MRI中,存在诸如GVL(巨型VM锁)之类的东西,它控制一次实际执行代码的线程。您会看到,在MRI中,一次只有一个线程可以执行Ruby代码。因此,尽管下面的C库在使用C代码中的CPU乘以巨型数字时可以让另一个线程运行,但代码本身不能同时执行。这意味着,诸如赋值之类的语句可能不会与另一个赋值同时运行(尽管添加操作可能会并行运行)。可能发生的另一件事是:我想我听说在Linux上对int的赋值是原子的,因此,如果您在Linux上,也可能是这样。

关于ruby - Ruby线程不会在写入时发生冲突吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11236080/

10-11 22:46
查看更多