Безопасно ли передавать обратный вызов js в функцию ffi, которая вызывает ее в другом потоке?

Скажем, у меня есть функция C, которая принимает обратный вызов и вызывает его в другом потоке:

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

Теперь я хочу вызвать эту функцию из javascript через Node-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 как-то синхронизирует вызов?

1 ответ

Взломали короткую демонстрацию, чтобы проверить это: https://github.com/madadam/rust_ffi_async_demo. (с использованием rust, а не C для нативной части, но это должно быть эквивалентно, так как ржавчина может быть собрана в обычную общую библиотеку)

Итак, после запуска демо-версии, я отвечал на свои вопросы, например:

  • Да, это кажется действительным и безопасным
  • Обратный вызов js выполняется в основном потоке
  • Кажется, Node-FFI обрабатывает синхронизацию, отправляя обратный вызов js в очередь, которая появляется в главном потоке.
Другие вопросы по тегам