我在一小段时间内为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对象,那又是为什么呢?
我还尝试将result更改为v8::Number类型,并通过current isolate和new isolate在myFunction中创建它,但得到了seg错误。
发布于 2016-01-01 20:58:18
@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)https://stackoverflow.com/questions/34475563
复制相似问题