在libuv工作线程中使用指向Isolate的指针

时间:2016-10-14 07:26:46

标签: c++ multithreading v8 libuv node.js-addon

我尝试开发一个与Isolate一起使用的异步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)

我的问题:将指向当前Isolate的指针传递给工作线程是否安全(出于只读目的)?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

说实话,我从未尝试过这样做。在我看来它应该没问题 - 只要你只是对隔离进行调用而不是实际修改其中的任何内容。

一般来说,如果你试图做任何违反V8线程模型的事情,它会产生一个例外 - 所以如果不是,那我就认为没问题。

答案 1 :(得分:0)

是的,这是可能的。但是,您是安全的责任人。您需要确保Isolate从父线程中退出并解锁。然后它可以在工作线程中使用(Entred)。