使用来自线程的v8句柄失败

时间:2014-11-29 02:45:59

标签: c++ node.js v8

根据我的理解,只要在线程访问的函数中使用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);

1 个答案:

答案 0 :(得分:2)

根据我尝试使用Lockers等的经验,唯一真正的方法是从其他线程使用uv_async将消息发送到执行回调函数的主线程。 The tests for uv_async可能有助于使用。