Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 MRI中,赋值是原子操作吗?_Ruby_Concurrency_Atomic_Atomicity_Mri - Fatal编程技术网

在ruby MRI中,赋值是原子操作吗?

在ruby MRI中,赋值是原子操作吗?,ruby,concurrency,atomic,atomicity,mri,Ruby,Concurrency,Atomic,Atomicity,Mri,假设我在课堂上有这两种方法 def set_val(val) @val = val end def get_val @val end 我将生成多个线程,用不同的值调用set\val。是否保证从@val读取返回正确的值,即不是最后分配的值,而是传递给set_val的值?我看书的时候会不会有奇怪的东西?赋值操作是原子的吗?它是不可分割的,与线程的数量无关吗?这取决于您使用的Ruby实现。至于MRI Ruby(“默认”Ruby),这是一个安全的(原子)操作,因为它的全局解释器锁可以保护一些

假设我在课堂上有这两种方法

def set_val(val)
  @val = val
end

def get_val
  @val
end

我将生成多个线程,用不同的值调用
set\val
。是否保证从
@val
读取返回正确的值,即不是最后分配的值,而是传递给
set_val
的值?我看书的时候会不会有奇怪的东西?赋值操作是原子的吗?它是不可分割的,与线程的数量无关吗?

这取决于您使用的Ruby实现。至于MRI Ruby(“默认”Ruby),这是一个安全的(原子)操作,因为它的全局解释器锁可以保护一些操作,比如来自bein的赋值,这些操作会被上下文开关中断

JRuby还指出,一些操作是线程安全的,包括对实例变量的赋值


在任何情况下,请确保考虑到任何此类并发访问都可以以看似随机的方式序列化。也就是说,除非使用显式锁(如a),否则无法保证先分配哪个线程,后分配哪个线程。

您能为MRI提供答案的来源吗?GIL的全部思想是保证Ruby级别上的单个操作永远不会被并发线程中断。甚至像+=操作符这样的东西(在JRuby和其他平台上使用肯定不安全)也在MRI上。