Dan*_*Tao 7 ruby concurrency multithreading
从过去在C#和Java中的工作开始,我习惯于这样的声明,例如这不是线程安全的:
x += y;
Run Code Online (Sandbox Code Playgroud)
但是,当与Ruby并行运行上面的代码时,我无法观察到线程之间的任何冲突.
我已经读过Ruby会自动阻止多个线程同时写入相同的数据.这是真的?+=因此运算符在Ruby中是否是线程安全的?
嗯,这取决于您的实施和很多事情。在 MRI 中,有一个叫做 GVL(巨型 VM 锁)的东西,它控制一次实际执行代码的线程。您会看到,在 MRI 中,一次只有一个线程可以执行Ruby代码。因此,虽然底层的 C 库可以让另一个线程运行,同时在C代码中使用 CPU来乘以巨数,但代码本身无法同时执行。这意味着,诸如赋值之类的语句可能不会与另一个赋值语句同时运行(尽管添加语句可能会并行运行)。另一件可能发生的事情是:我想我听说对ints 的赋值在 Linux 上是原子的,所以如果你使用的是 Linux,那也可能是这样。