我在主线程上有一个函数注册另一个本地线程的回调。当前,我遇到一个本机线程无法访问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
将导致主线程崩溃。
答案 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.
}