#javascript #c #node.js #multithreading #v8
#javascript #c #node.js #многопоточность #версия 8
Вопрос:
У меня есть функция в основном потоке, регистрирующая обратный вызов из другого собственного потока. В настоящее время я сталкиваюсь с проблемой, из-за которой собственный поток не может получить доступ к v8::Isolate. Я искал вокруг, кажется, нам нужно использовать v8:: Locker для многопоточности. Интересно, как именно мы должны это использовать? Я новичок в версии 8 и не смог найти хороший документ для ссылки.
Код:
Main thread:
void register_signaling_xml_callback(const Nan::FunctionCallbackInfo<v8::Value> amp;info) {
wa_call_register_signaling_xml_callback(details::wa_send_signaling_xml_cb, isolate); // Register the callback on native thread;
....
// v8::Unlocker unlocker(isolate); If I remove this comment, native thread can access the isolate. However, the below line will crash.
Nan::New(...);
}
Native thread:
int wa_send_signaling_data_cb(void *data, int len, void *userdata) {
....
Nan::EscapableHandleScope scope; // This line will crash due to can not get v8::Isolate.
}
Если я добавлю v8::Locker v8Locker(isolate) and then v8::Unlocker unlocker(isolate);
основной поток, собственный поток сможет получить доступ к v8::Isolate. Однако основной поток, похоже, теряет контроль над изоляцией и Nan::New
приведет к сбою в основном потоке.
Ответ №1:
Блокировки обычно создаются там, где используется ресурс. В этом случае блокировка должна произойти в функции обратного вызова:
Native thread:
int wa_send_signaling_data_cb(void *data, int len, void *userdata) {
....
v8::Locker v8Locker(); // no argument means default isolate
Nan::EscapableHandleScope scope; // This line will crash due to can not get v8::Isolate.
}