[英]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.