v8多线程储物柜

时间:2019-04-09 23:30:59

标签: javascript c++ node.js multithreading v8

我在主线程上有一个函数注册另一个本地线程的回调。当前,我遇到一个本机线程无法访问v8 :: Isolate的问题。我四处搜寻,似乎我们需要使用v8 :: Locker进行多线程处理。我想知道我们应该如何准确地使用它?我是V8的新手,找不到适合的文档。

代码:

Main thread:
void register_signaling_xml_callback(const Nan::FunctionCallbackInfo<v8::Value> &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 个答案:

答案 0 :(得分:2)

通常在使用资源的地方进行锁定。在这种情况下,锁定应发生在回调函数中:

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