我编写了一个示例程序,将Napi::Env对象传递给子线程以供使用,但在运行时发生了错误。
示例代码如下:
#include <napi.h>
#include <iostream>
#include <thread>
#include <chrono>
Napi::String Method(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
// ok
// Napi::Object obj = Napi::Object::New(env);
// obj.Set(Napi::String::New(env, "msg"), "hello world");
// std::string str = obj.Get("msg").As<Napi::String>();
// std::cout << "str : " << str << std::endl;
std::thread t([](Napi::Env env) {
std::cout << "run here 1" << std::endl;
Napi::Object obj = Napi::Object::New(env);
std::cout << "run here 2" << std::endl;
obj.Set(Napi::String::New(env, "msg"), "hello world");
std::cout << "run here 3" << std::endl;
std::string str = obj.Get("msg").As<Napi::String>();
std::cout << "str : " << str << std::endl;
}, info.Env());
t.join();
return Napi::String::New(env, "world");
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "hello"),
Napi::Function::New(env, Method));
return exports;
}
NODE_API_MODULE(hello, Init)错误如下:

谢谢你的帮忙!
发布于 2022-01-03 13:00:13
不允许从主线程以外的其他线程调用V8原语--这是编写节点加载项时最基本的约束之一。
Napi::Env只是一个指针,但不可能从另一个线程调用Napi::Object中的任何内容。
如果要实现异步方法,则应该在分叉新线程之前从V8复制所有参数。这方面的唯一例外是ArrayBuffer-backed对象,您可以在主线程中获取指针,然后在另一个线程中使用指针。
https://stackoverflow.com/questions/69001710
复制相似问题