2011-03-14 25 views

回答

-1

最好的解决方案是使用没有GIL(全局解释器锁)的ruby运行时(如JRuby) - 它应该正确处理中断阻塞的FFI调用。

在其他ruby运行时,为了使本机通话可以中断,您需要将该功能标记为“阻塞”功能--FFI将在调用此功能时解锁GIL,并将其设置为中断。

例如

require 'ffi' 
module Sleep 
    extend FFI::Library 

    ffi_lib FFI::Library::LIBC 

    # Tell FFI that this function may block 
    @blocking = true 
    attach_function :sleep, [:uint], :void 
end 

@blocking不粘 - 您需要在每个'attach_function'调用之前将其设置为标记为阻塞。

而且它不是100%肯定的解决方案。中断在本地代码中被阻塞的函数通常适用于可中断的函数(例如睡眠,读取,写入等),但不适用于某些本地代码(例如,cpu密集型计算,可能还有许多其他类型)。

+0

** DO NOT **设置私有像这样的FFI内的实例变量。相反,对[attach_function]使用':blocking'选项(http://rdoc.info/gems/ffi/FFI/Library:attach_function)。 – SFEley

2

我没有测试这一点,但通过在FFI库library.rb该编码判断,这应该是上述一个更好的替代方案:

require 'ffi' 
module Sleep 
    extend FFI::Library 

    ffi_lib FFI::Library::LIBC 

    attach_function :sleep, [:uint], :void, :blocking => true 
end 
+0

为什么downvote? –