在libuv工作线程中使用指针隔离

Using a pointer to Isolate in libuv worker thread

本文关键字:指针 隔离 libuv 工作 线程      更新时间:2023-10-16

我尝试开发一个异步Node.js插件,与隔离工作。

考虑这个示例代码:

struct Work {
  uv_work_t  request;
  Persistent<Function> callback;
  Isolate * isolate;
};
// called in worker thread
static void WorkAsync(uv_work_t *req)
{
    Work *work = static_cast<Work *>(req->data);
    HeapStatistics stats;
    work->isolate->GetHeapStatistics(&stats);
    // ... do other stuff ...
}
// called by in main thread
static void WorkAsyncComplete(uv_work_t *req, int status)
{
    Isolate * isolate = Isolate::GetCurrent();
    v8::HandleScope handleScope(isolate);
    Work *work = static_cast<Work *>(req->data);
    // ... do other stuff ...
    work->callback.Reset();
    delete work;
}
void RunAsync(const v8::FunctionCallbackInfo<v8::Value>&args) {
    Isolate* isolate = args.GetIsolate();
    Work * work = new Work();
    work->request.data = work;
    work->isolate = isolate;
    Local<Function> callback = Local<Function>::Cast(args[0]);
    work->callback.Reset(isolate, callback);
    // kick of the worker thread
    uv_queue_work(uv_default_loop(), &work->request, WorkAsync, WorkAsyncComplete);
    args.GetReturnValue().Set(Undefined(isolate));
}
void setup(Handle <Object> exports, Handle<Object> module) {
  NODE_SET_METHOD(exports, "run", RunAsync);
}
NODE_MODULE(addon, setup)

我的问题:将指针传递到当前隔离到工作线程(用于只读目的)是否安全?

谢谢!

Scott Frees的回答( c++和Node.js集成的作者电子书:https://scottfrees.com/ebooks/nodecpp/):

老实说,我从来没有试过那样做。在我看来,这应该是好的——只要你只是在隔离上调用,而不是实际修改其中的任何内容。

一般来说,如果你试图做任何违反V8线程模型的事情,它将生成一个异常-所以如果它不是,那么我认为它是ok的。

这是可能的。但是,你要对安全负责。您需要确保将Isolate从父线程中分离出来并解锁。然后它可以在工作线程中使用(enter)。