繁体   English   中英

从子线程访问指针

[英]Access a pointer from a child thread

我有一个看起来像这样的结构:

struct Work {
  uv_work_t requst;
  Local<Promise::Resolver> resolver;
};

然后,我有了使用imagemagick裁剪图像的方法:

void MagickNode::Crop(const FunctionCallbackInfo<Value> &args) {
  // Create a promise
  Local<Promise::Resolver> resolver = v8::Promise::Resolver::New(i.isolate);
  args.GetReturnValue().Set(resolver->GetPromise());

  // Create a worker
  Work *work = new Work();
  work->requst.data = work;
  work->resolver = resolver;

  // Do work
  uv_queue_work(uv_default_loop(), &work->requst, [](uv_work_t *req) {
    // Do the heavy lifting
  }, WorkVoidComplete);
}

该过程完成后,我想兑现承诺。 我在这里做的:

void MagickNode::WorkVoidComplete(uv_work_t *req, int status) {
  // Setup the required items
  Isolate *isolate = Isolate::GetCurrent();
  v8::HandleScope handleScope(isolate);
  Work *work = static_cast<Work *>(req->data);

  // Resolve the promise
  work->resolver->Resolve(Undefined(isolate));
  delete work;
}

问题是,当work->resolver->Resolve运行时,它给出了Segmentation fault 我认为这是因为在父线程上创建它时,它是从线程执行的,这使我无法访问。

如何获得访问权限并运行该行?

如果我将那行移到MagickNode::Crop方法的MagickNode::Crop ,它将运行无错误,并且会调用promise。

实际上,您的WorkVoidComplete将在循环线程中被调用。 这里的问题是您使用的是Local<T>句柄而不是Persistent<T>句柄。

MagickNode::Crop的范围关闭时,将释放本地句柄。

将结构更改为使用v8::Persistent<Promise::Resolver>将解决此问题。 请注意,使用持久引用句柄完成操作后,必须通过调用Reset()手动释放它。

class Work {
 public:
  Work(Isolate* i, Local<Promise::Resolver> r)
    : isolate_(i) {
      resolver_.Reset(i, r);
    }

  ~Work() {
    resolver_.Reset();
  }

  inline uv_work_t* request() { return &request_; }
  inline Isolate* isolate() { return isolate_; }
  inline Local<Promise::Resolver> resolver() {
    return resolver_.Get(isolate_);
  }

 private:
  Isolate* isolate_;
  Persistent<Promise::Resolver> resolver_;
  uv_work_t request_;
};

void Something(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();
  Local<Context> context = isolate->GetCurrentContext();

  Local<Promise::Resolver> resolver =
    v8::Promise::Resolver::New(context).ToLocalChecked();

  Work* work = new Work(isolate, resolver);
  work->request()->data = work;
  uv_queue_work(uv_default_loop(), work->request(), DoWork, WorkComplete);

  args.GetReturnValue().Set(resolver->GetPromise());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM