大家好。我最近写了关于 MRI 2.0 Timeout 的内部实现。众所周知,有时 Timeout 有效果,但有时 Timeout 没有反应。我解释这种现象的原因。
http://redgetan.cc/understanding-timeouts-in-cruby/
欢迎大家的 Comments, feedback
请教楼主, 其中提到用 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_wait
跟 man pthread_cond_signal
有更详细的解释
谢谢,明白了,由 raise 来进行唤醒
while(true){} 能跳出来是因为 vm 的 jump 会检查是不是有 timeout 留下的 kill signal 这就很好解释了,为什么 c extension 里写 while 死循环和 sleep 会跳不出来的问题了。