7

メインスレッドではないスレッド内で c++ から v8 を使用しようとしています。v8に関する限り、マルチスレッドはありません。すべてのv8オブジェクトは、そのスレッド内で作成および破棄されます。何も並行して実行されておらず、何も共有されていません。メインスレッドからプログラムを実行すると、すべて正常に動作します。別のスレッドに v8 のものがある場合、v8::HandleScope を作成するとセグメンテーション違反が発生します。

v8 でスレッド化が実際にどのように処理されているかについての有用なドキュメントが見つかりません。検索すると「アイソレートとロッカーを使用する」という指示が頻繁に表示されますが、これがどのように行われるかの例は見つかりません。v8::Isolate にはこの API doc がありますが、そのページには、特定のケースでそれらが必要かどうかはわかりません (メモリを共有したり、並列で実行したりしていません)。v8::Locker() のドキュメントには、クラスの目的に関する情報さえありません。プロジェクトに含まれるサンプルも、このいずれにも対応していません。

だから私の質問は...

  • ここでアイソレートやロッカーを使用する必要がありますか?
  • それらの使用方法の最小限の例を得ることができますか? 疑似コードでも何かが本当に役に立ちます
4

1 に答える 1

2

HandleScope を呼び出すときに、コンテキストで動作するメソッドに V8::Locker が必要です。https://github.com/jasondelponte/go-v8/blob/master/src/v8context.cc#L41は、v8 でロッカーを使用した例です。この例では複数のスレッドで使用されていますが、このルールは単一のスレッドにも当てはまると思います。

アイソレートは、v8 の複数のインスタンスを並行して使用する場合にのみ必要です。

https://groups.google.com/forum/?fromgroups=#!topic/v8-users/FXpeTYuAqKIは、少し前に見つけた古いスレッドで、HandleScope ローカル変数を使用するとすぐにライブラリがクラッシュするという問題を解決するのに役立ちました。作成した。

于 2013-01-21T07:57:54.617 に答える