在ruby MRI中分配是原子操作吗?

问题描述 投票:1回答:1

假设我班上有这两种方法。

def set_val(val)
  @val = val
end

def get_val
  @val
end

我将生成多个线程来调用具有不同值的set_val。是否保证从@val读取返回正确的值,即不是最后指定的值,而是传递给set_val的值?读书时我能得到一些奇怪的东西吗?赋值操作是原子的吗?无论线程数多少,它都是不可分割的吗?

ruby concurrency atomic atomicity mri
1个回答
2
投票

这取决于您正在使用的Ruby实现。至于MRI Ruby(“默认”Ruby),这是一个安全(原子)操作,因为它的全局解释器锁可以保护某些操作,例如由上下文切换中断的bein。

JRuby还guarantees表示某些操作是线程安全的,包括赋值给实例变量。

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

© www.soinside.com 2019 - 2024. All rights reserved.