nodejs native addon multithreading

时间:2015-12-26 21:53:26

标签: c++ node.js multithreading v8 node.js-addon

我在一段时间内为nodejs开发了原生模块,有些情况对我来说并不是很清楚。不幸的是,v8文档并不是很好。

所以对我来说有一个有趣的领域。 首先是可以在主本机模块线程中使用std::thread吗?文档说我可以使用libuv函数并运行异步操作,但在这个库中我们无法访问v8对象。但是,如果我想在主线程中同步我的计算同步,例如,在另一个线程中修改一些JS对象属性及其结果,该怎么办?

我尝试了以下代码:

double result;
void myFunction(Local<Value> a, Local<Value> b)
{
    std::cout << "from thread " << std::this_thread::get_id() << " " << std::endl;
    result = a->NumberValue() + b->NumberValue();
}
void add(const FunctionCallbackInfo<Value>& args)
{
  Isolate* isolate = args.GetIsolate();
  std::cout << "main "<< std::this_thread::get_id() << std::endl;
  thread thread(myFunction, args[0], args[1]);
  thread.join();
  args.GetReturnValue().Set(Number::New(isolate, result));
}

它可以正常运行,但是如果我们无法访问另一个线程中的v8对象呢?

我也尝试将结果更改为v8 :: Number类型,并通过当前隔离和新隔离在myFunction中创建它,但是得到seg错误。

1 个答案:

答案 0 :(得分:0)

@RaxWunter换句话说我不明白为什么这样的代码有效

void myFunction(Local<Value> a, Local<Value> b, Isolate* pIsolate, Local<Number>& num)
{
    cout << "from thread " << this_thread::get_id() << " " << pIsolate << endl; 
    num = Number::New(pIsolate, a->NumberValue() + b->NumberValue()); 
} 
void add(const FunctionCallbackInfo<Value>& args)
{ 
    Isolate* isolate = args.GetIsolate(); 
    Local<Number> num; 
    thread thread1(myFunction, args[0], args[1], isolate, std::ref(num));
    thread1.join(); 
    args.GetReturnValue().Set(num); 
}
void Init(Local<Object> exports) 
{
    NODE_SET_METHOD(exports, "add", add);
}
NODE_MODULE(addon, Init)