1

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

def set_val(val)
  @val = val
end

def get_val
  @val
end

我将产生多个线程来调用set_val不同的值。是否保证读取 from@val返回正确的值,即不是最后分配的值,而是传递给的值set_val?我在阅读时会得到一些奇怪的东西吗?赋值操作是原子的吗?无论线程数如何,它都是不可分割的吗?

4

1 回答 1

2

这在一定程度上取决于您使用的 Ruby 实现。至于 MRI Ruby(“默认”Ruby),这是一个安全的(原子)操作,因为它的 Global Interpreter Lock 可以保护一些操作,例如分配不被上下文切换中断。

JRuby 还保证某些操作是线程安全的,包括对实例变量的赋值。

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

于 2019-03-06T18:50:30.260 回答