2016-08-16 224 views
7

說我有一個C函數,它接受一個回調,並調用它在另一個線程:將js回調傳遞給一個在另一個線程中調用它的ffi函數是否安全?

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

現在我想打電話給通過節點FFI從JavaScript這個功能,通過一個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回調推送到在主線程上彈出的隊列來處理同步。
相關問題