2016-08-16 4 views
7

は、私は、コールバックを取り、別のスレッドでそれを呼び出すC関数を持っていると言う:jsコールバックを別のスレッドで呼び出すffi関数に渡すことは安全ですか?

void call_in_new_thread(void (*callback)()) { 
    // spawn a new thread and call `callback` in it ... 
} 

は今、私はそれにJavaScript関数を渡し、ノードFFI経由してJavaScriptからこの関数を呼び出したい:

var callbackType = 'pointer' 
var lib = ffi.Library('mylib', { 
    'call_in_new_thread': [ 'void', [ callbackType ] ], 
}) 

var callback = ffi.Callback('void', [ 'void' ], function() { 
    // which thread I'm in now? 
    console.log("hello!") 
}) 

lib.call_in_new_thread(callback) 

私の質問:有効ですか?スレッドセーフですか?実際にjavascriptコールバックはどのスレッドで実行されますか? node.jsメインスレッド、またはffiライブラリによって作成されたスレッドでは? Node-FFIは何とかコールを同期させますか?

答えて

4

これをテストするためのデモを一緒にハッキングしました:https://github.com/madadam/rust_ffi_async_demo (ネスト部分には錆を使用してCを使用していませんが、これは通常の共有ライブラリに錆が発生する可能性があります)。

ので、デモを実行した後、私はこのように私自身の質問に答えるでしょう:

  • はい、有効かつ安全であるように思わ
  • ザ・JSコールバックはメインスレッドで実行されます
  • Node-FFIは、jsコールバックをメインスレッド上でポップされるキューにプッシュすることによって同期を処理するようです。
関連する問題