1

少しの間、nodejs 用のネイティブ モジュールを開発しましたが、いくつかのケースは私にはよくわかりません。残念ながら、v8 のドキュメントはあまり良くありません。

ですから、私にとって興味深い分野の 1 つがあります。まずstd::thread、メインのネイティブ モジュール スレッドで使用することは可能ですか? ドキュメントには、libuv 関数を使用して非同期操作を実行できると書かれていますが、このライブラリ内では v8 オブジェクトにアクセスできません。しかし、メイン スレッドで同期的に計算を並列化し、たとえば、一部の JS オブジェクト プロパティをその結果で別のスレッドで変更したい場合はどうすればよいでしょうか?

次のコードを試しました:

double result;
void myFunction(Local<Value> a, Local<Value> b)
{
    std::cout << "from thread " << std::this_thread::get_id() << " " << std::endl;
    result = a->NumberValue() + b->NumberValue();
}
void add(const FunctionCallbackInfo<Value>& args)
{
  Isolate* isolate = args.GetIsolate();
  std::cout << "main "<< std::this_thread::get_id() << std::endl;
  thread thread(myFunction, args[0], args[1]);
  thread.join();
  args.GetReturnValue().Set(Number::New(isolate, result));
}

そして、期待どおりに動作しますが、別のスレッドで v8 オブジェクトにアクセスできないのはなぜでしょうか?

また、結果を v8::Number 型に変更し、現在の分離と新しい分離を介して myFunction 内に作成しようとしましたが、seg fault が発生します。

4

1 に答える 1

0

@RaxWunter 言い換えれば、そのようなコードが機能する理由がわかりません

void myFunction(Local<Value> a, Local<Value> b, Isolate* pIsolate, Local<Number>& num)
{
    cout << "from thread " << this_thread::get_id() << " " << pIsolate << endl; 
    num = Number::New(pIsolate, a->NumberValue() + b->NumberValue()); 
} 
void add(const FunctionCallbackInfo<Value>& args)
{ 
    Isolate* isolate = args.GetIsolate(); 
    Local<Number> num; 
    thread thread1(myFunction, args[0], args[1], isolate, std::ref(num));
    thread1.join(); 
    args.GetReturnValue().Set(num); 
}
void Init(Local<Object> exports) 
{
    NODE_SET_METHOD(exports, "add", add);
}
NODE_MODULE(addon, Init)
于 2016-01-01T12:58:17.677 に答える