Безопасно ли передавать обратный вызов 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 в очередь, которая появляется в главном потоке.