gpt4 book ai didi

c++ - nodejs 原生插件多线程

转载 作者:太空宇宙 更新时间:2023-11-04 13:22:48 25 4
gpt4 key购买 nike

我在一段时间内为 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 中创建它,但出现段错误。

最佳答案

@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)

关于c++ - nodejs 原生插件多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34475563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com