v8 Locker для многопоточных

#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.
}