Ruby Ruby 2.0 Timeout 的内部实现

redgetan · 2014年08月18日 · 最后由 chanshunli 回复于 2014年11月07日 · 4238 次阅读

大家好。我最近写了关于 MRI 2.0 Timeout 的内部实现。众所周知,有时 Timeout 有效果,但有时 Timeout 没有反应。我解释这种现象的原因.

http://redgetan.cc/understanding-timeouts-in-cruby/

欢迎大家的 Comments, feedback

Minecraft 好评 😄

这种文章应该加精 👍

没想到会有挺多的回复。 多谢!

这才是干货。 👍

ruby5 好像介绍过这篇文章,原来是 lz 写的, 顶!

:plus1: pocket

请教楼主, 其中提到用 c stdlib 的 sleep 是搞不定的,那换用 ruby 里的 native_sleep and sleep_forever 是不是就可以了呢?

@hhuai 对. 因为 native_sleep 注册了一个 unblock function. 当第二个线程执行 Thread#raise 的时候, 主线程会由于 unblock function 叫醒.

native_sleep 内部使用 pthread_cond_wait unblock function 叫 pthread_cond_signal

man pthread_cond_waitman pthread_cond_signal 有更详细的解释

谢谢,明白了,由 raise 来进行唤醒

while(true){} 能跳出来是因为 vm 的 jump 会检查是不是有 timeout 留下的 kill signal 这就很好解释了,为什么 c extension 里写 while 死循环和 sleep 会跳不出来的问题了。

匿名 #16 2014年11月07日

:plus1:

需要 登录 后方可回复, 如果你还没有账号请 注册新账号