2016-10-14 9 views
0

私はIsolateで動作する非同期Node.jsアドオンを開発しようとしています。 libuvワーカースレッドで分離するためのポインタを使用

は、この例のコードを考えてみましょう:

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) 

私の質問:それは(読み取り専用の目的で)ワーカースレッドに現在のアイソへのポインタを渡すために安全ですか?

ありがとうございます!スコット解放します(:https://scottfrees.com/ebooks/nodecpp/C++およびNode.jsの統合電子ブックの著者):によって回答

答えて

0

正直に言うと、私はそれを行うことを試みたことがありません。あなたが単離したものを呼び出すだけで、その中の何かを実際に変更しない限り、それはうまくいくはずです。

一般に、V8スレッディングモデルに違反して何かしようとすると、例外が生成されます。そうでない場合は、正常であると思います。

0

はい、可能です。しかし、あなたは安全の責任があります。 Isolateが親スレッドから離脱し、ロックが解除されていることを確認する必要があります。次に、ワーカースレッドで(Entred)使用することができます。

関連する問題