从过去的 C# 和 Java 工作中,我习惯于这样的声明不是线程安全的:
x += y;
但是,当与 Ruby 并行运行上述代码时,我无法观察到线程之间的任何冲突。
我读过Ruby 会自动阻止多个线程同时写入相同的数据。这是真的?因此运算符在 Ruby 中是+=
线程安全的吗?
从过去的 C# 和 Java 工作中,我习惯于这样的声明不是线程安全的:
x += y;
但是,当与 Ruby 并行运行上述代码时,我无法观察到线程之间的任何冲突。
我读过Ruby 会自动阻止多个线程同时写入相同的数据。这是真的?因此运算符在 Ruby 中是+=
线程安全的吗?
好吧,这取决于您的实施和很多事情。在 MRI 中,有一个诸如 GVL(Giant VM Lock)之类的东西,它控制一次实际执行代码的线程。你看,在 MRI 中,一次只有一个线程可以执行Ruby代码。因此,虽然下面的 C 库可以让另一个线程运行,同时它们在C代码中使用 CPU 来乘以巨大的数字,但代码本身不能同时执行。这意味着,诸如赋值之类的语句可能不会与另一个赋值同时运行(尽管添加可能并行运行)。可能发生的另一件事是:我想我听说int
s 的分配在 Linux 上是原子的,所以如果你在 Linux 上,那也可能是这样。
x += 1
在各方面都等价于
x = x + 1
(如果你重新定义+
,你也会自动重新定义 的结果+=
)
在这种表示法中,更清楚的是这不是原子操作,因此不能保证线程安全。