访问被拒绝,你可能没有权限或未登录。

Ruby Ruby 2.0 Timeout 的内部实现

redgetan · August 18, 2014 · Last by chanshunli replied at November 07, 2014 · 4408 hits

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

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

欢迎大家的 Comments, feedback

Minecraft 好评 😄

这种文章应该加精 👍

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

这才是干货。 👍

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

:thumbsup:

: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 会跳不出来的问题了。

Unknow user #15 November 07, 2014

:plus1:

You need to Sign in before reply, if you don't have an account, please Sign up first.