Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby线程能否在写入时不发生冲突?_Ruby_Multithreading_Concurrency - Fatal编程技术网

Ruby线程能否在写入时不发生冲突?

Ruby线程能否在写入时不发生冲突?,ruby,multithreading,concurrency,Ruby,Multithreading,Concurrency,从过去在C#和Java中的工作来看,我习惯于这样一种说法,即线程不安全: x += y; 然而,在与Ruby并行运行上述代码时,我无法观察到线程之间的任何冲突 我读过。这是真的吗?因此,Ruby中的+=操作符是线程安全的吗?好吧,这取决于您的实现和很多事情。在MRI中,有一个像GVL(巨型VM锁)这样的东西,它控制哪个线程一次实际执行代码。在MRI中,一次只能有一个线程执行Ruby代码。因此,虽然下面的C库可以让另一个线程运行,同时使用C代码中的CPU来乘法,但代码本身不能同时执行。这意味着,

从过去在C#和Java中的工作来看,我习惯于这样一种说法,即线程不安全:

x += y;
然而,在与Ruby并行运行上述代码时,我无法观察到线程之间的任何冲突


我读过。这是真的吗?因此,Ruby中的
+=
操作符是线程安全的吗?

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

x += 1
在各方面都相当于

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


在这个符号中,更清楚的是,这不是一个原子操作,因此不能保证线程安全。

如果在执行<代码> x+= y中间的线程,吉尔是否会被丢弃?还是只有在声明边界上才能获得和发布?还是更高级别的边界?关于线程的一个非常详细的答案可以在@sarnold中找到:GVM的发布完全取决于下面的C代码。例如,在
Bignum
乘法的实现中,如果数字超出了一定的大小,那么GVL将被释放,以便其他Ruby代码可以在C乘法时执行。只有在开发C扩展时才真正关心GVL。@Ckhrysze:在MRI Ruby中获得并行性的唯一真正方法是使用多个进程。其他实现,如JRuby、Rubinus、MacRuby和IronRuby,通常基于底层平台(Java、C、Objective-C和.NET)的并发性提供真正的并发性。@sarnold:不一定。您可能会很好,但在大多数情况下,在处理共享变量时始终使用互斥体。依靠技术细节和小细节不会让你以后这么高兴。我知道
+=
使用
+
操作符。我想我应该把我的问题缩小到整数加法,因为这是我最好奇的情况。不过,我很想知道是什么让你对这个答案如此自信。正如我所说,我熟悉C#和Java,你所说的是正确的。但到目前为止,我还没有看到使用核磁共振成像的证据;事实上,我所能找到的(比如我在问题中链接到的那篇文章)似乎恰恰相反。我想我所说的是一个参考是非常感谢的:)你有信心没有其他执行线程可以在检索其值到写入新值之前更新
x