根据我的理解,只要在线程访问的函数中使用v8 :: Locker,v8就支持多线程。
但是在以下示例中,我无法使用来自线程的回调:
static Persistent<v8::Function> cb;
void PostMessage(){
Isolate* isolate = Isolate::GetCurrent();
v8::Locker locker(isolate);
HandleScope scope(isolate);
const unsigned argc = 1;
Local<Value> argv[argc] = { String::NewFromUtf8(isolate, "test") };
Local<v8::Function> PostMessageCb = Local<v8::Function>::New(isolate, cb);
(PostMessageCb)->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}
void SetupCallback(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
v8::Locker locker(isolate);
HandleScope scope(isolate);
Local<v8::Function> local_cb = Local<v8::Function>::Cast(args[0]);
cb.Reset(isolate, local_cb);
}
void UseCallback(const FunctionCallbackInfo<Value>& args) {
//PostMessage(); <- that works
std::thread t(PostMessage); // <- that doesn't
t.join();
}
我是否错误地使用了v8 :: Locker?
编辑:发现我的代码有问题。而不是
(PostMessageCb)->Call(isolate->GetCurrentContext()->Global(), argc, argv);
获取创作背景:
(PostMessageCb)->Call(PostMessageCb->CreationContext()->Global(), argc, argv);
答案 0 :(得分:2)
根据我尝试使用Lockers等的经验,唯一真正的方法是从其他线程使用uv_async
将消息发送到执行回调函数的主线程。 The tests for uv_async
可能有助于使用。