首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Napi::Env可以用于子线程吗?

Napi::Env可以用于子线程吗?
EN

Stack Overflow用户
提问于 2021-08-31 15:45:09
回答 1查看 391关注 0票数 2

我编写了一个示例程序,将Napi::Env对象传递给子线程以供使用,但在运行时发生了错误。

示例代码如下:

代码语言:javascript
复制
#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)

错误如下:

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2022-01-03 13:00:13

不允许从主线程以外的其他线程调用V8原语--这是编写节点加载项时最基本的约束之一。

Napi::Env只是一个指针,但不可能从另一个线程调用Napi::Object中的任何内容。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69001710

复制
相关文章

相似问题

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