【问题标题】:Is it safe to pass a JavaScript callback to an FFI function which calls it in another thread?将 JavaScript 回调传递给在另一个线程中调用它的 FFI 函数是否安全?
【发布时间】:2016-12-22 17:33:23
【问题描述】:

我有一个 C 函数,它接受一个回调并在另一个线程上调用它:

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

我想通过 Node-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 是否以某种方式同步调用?

【问题讨论】:

    标签: javascript node.js multithreading node-ffi


    【解决方案1】:

    我一起破解了a quick demo to test this out。它在原生部分使用 Rust 而不是 C,但这应该是等效的,因为 Rust 可以编译为普通的共享库。

    运行演示后,我会像这样回答我自己的问题:

    • 是的,它似乎是有效且安全的
    • JavaScript 回调在主线程中执行
    • Node-FFI 似乎通过将 JavaScript 回调推送到在主线程上弹出的队列来处理同步

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多