0

我写了一个示例程序,将 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)

错误如下:

在此处输入图像描述

感谢您的帮助!

4

1 回答 1

0

不允许从主线程以外的其他线程调用 V8 原语 - 这是编写 Node 插件时最基本的约束之一。

ANapi::Env只是一个指针,但Napi::Object不可能从另一个线程调用任何东西。

如果你正在实现一个异步方法,你应该在 fork 一个新线程之前从 V8 复制你的所有参数。唯一的例外是ArrayBuffer-backed 对象,您可以在主线程中获得一个指针,然后在另一个线程中使用它。

于 2022-01-03T13:00:13.560 回答