Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从线程使用v8句柄失败_C++_Node.js_V8 - Fatal编程技术网

C++ 从线程使用v8句柄失败

C++ 从线程使用v8句柄失败,c++,node.js,v8,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

据我所知,只要在线程访问的函数中使用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();
}
获取创建上下文:

(PostMessageCb)->Call(PostMessageCb->CreationContext()->Global(), argc, argv);

根据我尝试使用储物柜之类的工具的经验,唯一真正做到这一点的方法就是从另一个线程发送消息到执行回调函数的主线程。可能有助于使用。

“我无法使用线程回调”-我们不是读心术者,您必须告诉我们为什么不能使用它和/或失败的原因和位置。分段错误发生在PostMessage函数的最后一行。感谢您为我指出了正确的方向。没有意识到libuv可以使用node.js默认循环。这个libuv的介绍真的很有帮助
(PostMessageCb)->Call(PostMessageCb->CreationContext()->Global(), argc, argv);