7

从过去的 C# 和 Java 工作中,我习惯于这样的声明不是线程安全的:

x += y;

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

我读过Ruby 会自动阻止多个线程同时写入相同的数据。这是真的?因此运算符在 Ruby 中是+=线程安全的吗?

4

2 回答 2

2

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

于 2012-06-27T23:23:53.503 回答
0
x += 1

在各方面都等价于

x = x + 1

(如果你重新定义+,你也会自动重新定义 的结果+=

在这种表示法中,更清楚的是这不是原子操作,因此不能保证线程安全。

于 2012-06-28T20:10:49.297 回答