ruby MRI 中的赋值是原子操作吗?
Is assignment an atomic operation in ruby MRI?
假设我的 class.
中有这两种方法
def set_val(val)
@val = val
end
def get_val
@val
end
我将生成多个线程以使用不同的值调用 set_val
。是否保证从 @val
returns 读取正确的值,即不是最后分配的值,而是传递给 set_val
的值?阅读时我会得到一些奇怪的东西吗?赋值操作是原子的吗?是不是不管线程数都是不可分割的?
这在一定程度上取决于您使用的 Ruby 实现。至于 MRI Ruby("default" Ruby),这是一个安全的(原子的)操作,因为它的全局解释器锁可以保护一些操作,例如赋值,不被上下文切换中断。
JRuby 还 guarantees 一些操作是线程安全的,包括对实例变量的赋值。
无论如何,请务必考虑到任何此类并发访问都可能以看似随机的方式序列化。也就是说,除非使用 Mutex.
等显式锁,否则无法保证哪些线程先分配,哪些线程最后分配。
假设我的 class.
中有这两种方法def set_val(val)
@val = val
end
def get_val
@val
end
我将生成多个线程以使用不同的值调用 set_val
。是否保证从 @val
returns 读取正确的值,即不是最后分配的值,而是传递给 set_val
的值?阅读时我会得到一些奇怪的东西吗?赋值操作是原子的吗?是不是不管线程数都是不可分割的?
这在一定程度上取决于您使用的 Ruby 实现。至于 MRI Ruby("default" Ruby),这是一个安全的(原子的)操作,因为它的全局解释器锁可以保护一些操作,例如赋值,不被上下文切换中断。
JRuby 还 guarantees 一些操作是线程安全的,包括对实例变量的赋值。
无论如何,请务必考虑到任何此类并发访问都可能以看似随机的方式序列化。也就是说,除非使用 Mutex.
等显式锁,否则无法保证哪些线程先分配,哪些线程最后分配。