首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs原生插件多线程

nodejs原生插件多线程
EN

Stack Overflow用户
提问于 2015-12-27 05:53:26
回答 1查看 1.6K关注 0票数 1

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

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

我尝试了以下代码:

代码语言:javascript
复制
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对象,那又是为什么呢?

我还尝试将result更改为v8::Number类型,并通过current isolate和new isolate在myFunction中创建它,但得到了seg错误。

EN

回答 1

Stack Overflow用户

发布于 2016-01-01 20:58:18

@RaxWunter换句话说,我不明白为什么这样的代码可以工作

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34475563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档