MRI 1.9的Ruby GIL

时间:2015-10-03 08:01:04

标签: ruby multithreading gil

根据我的理解,这里是MRI 1.9 GIL的工作原理:

  1. 解释器通过调用相应的底层C函数生成一个新线程,并要求获取" GIL"。
  2. 如果" GIL"是免费的,我们很高兴。如果没有,新线程将等待并调用另一个单独的计时器线程来设置" timeslice"
  3. 当前执行的线程遇到某些边界(如返回或检查后向分支)时,解释器会检查计时器以确定是否应该进行上下文切换。
  4. 然而,正如article所指出的,我们只能保证纯C实现的原子性。话虽这么说,如果我们的线程的某些部分包含ruby代码,我们仍然处于竞争状态的危险之中。

    我的问题是线程是否需要在执行之前获取GIL,为什么只有C实现方法才能保证原子性?

    提前谢谢!

1 个答案:

答案 0 :(得分:0)

GVL保证只有一个线程可以在同时执行Ruby代码。但是当然不同的Ruby线程可以在不同的时间执行Ruby代码。

此外,大多数Ruby实现无论如何都没有GVL。