JRubyのようなGIL(グローバルインタプリタロック)を持たないRubyランタイムを使用することをお勧めします。ブロックされたFFI呼び出しを正しく処理する必要があります。
他のルビーランタイムでは、ネイティブ呼び出しを中断できるようにするには、関数を「ブロッキング」関数としてマークする必要があります.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%確実な解決策ではありません。ネイティブコードでブロックされている関数を中断することは、割り込み可能な関数(例えばスリープ、リード、ライトなど)では一般的に機能しますが、一部のネイティブコードでは機能しません。
私はこれをテストしていませんが、FFIリポジトリにlibrary.rbのコードによって判断し、これは上記のよりよい選択肢でなければなりません
このようなFFI内のインスタンス変数。代わりに、[attach_function](http://rdoc.info/gems/ffi/FFI/Library:attach_function)に ':blocking'オプションを使用してください。 – SFEley