0

私はGoogleのV8を初めて使用しますが、それらが提供する変数タイプを完全に使用する方法がわかりません。私が何になりたいかを説明することから始めましょう:

  1. メインスレッドでJSスクリプトをコンパイルしたいと思います。
  2. いくつかのスレッドでは、instance-> SetAccessor(...)またはprototype-> Set(...)(または存在する場合は他のオプション)を使用してコンテキストにさまざまな情報を「追加」するときにスクリプトを実行したいと思います。

次のことをいつ行う必要があるのか​​わかりません。

  • いつどこで作成しv8::handleScopeますか?メインスレッドで作成するだけで十分ですか?または、スレッドごとに1つ必要ですか?
  • いつどこで作成するv8::isolatev8::lockerか?スレッドごとにする必要がありますか?それは前か後v8::handleScopeか?

任意の情報が役立ちます(:

4

1 に答える 1

1

クロススレッド共有を使用せずに各スレッドからスクリプトを並行して実行する場合は、各スレッドに独自の分離が必要です。メインスレッドに実際に必要な場合と不要な場合があります。または、デフォルトの分離を使用することもできます。ただし、他のスレッドの1つが初期化してしまう場合に備えて、スレッドを実行する前にデフォルトの分離が初期化されていることを確認することをお勧めします。分離株を使用している場合は問題ないはずですが、確かに害はありません。

オブジェクトのクロススレッド共有などが必要な場合は、これを調査する必要があり、難しい可能性があります。v8が本当にそれをサポートできるかどうかさえわかりません。個別の分離を持ち、オブジェクトの共有を回避する方がはるかに簡単です。

メインスレッドでスクリプトを実行するスレッドを対象とした分離のコンテキストでスクリプトをコンパイルしてから、スクリプトと分離をスレッドに渡し、メインスレッドでスクリプトを再度タッチしないようにする必要があります。ワーカースレッドはそれで完了します。これは機能するはずですが、v8が分離が作成されたスレッドIDと実行されるスレッドIDをチェックするかどうかはチェックしていません。これが機能することを確認するために、小さなテストアプリを作成する価値があります。

もう1つのオプションは、メインスレッドでコンパイルを確認し、ワーカースレッドで再度コンパイルして、分離をスレッドにカプセル化することです。これは私が過去にそれをした方法です。簡単ですが効率が悪くなります。

ハンドルスコープは、必要な関数でのみスタックに割り当てる必要があります。ハンドルスコープにグローバル変数を使用したり、ヒープに割り当てたりしないでください。コンパイルされたスクリプトは永続的なハンドルを使用する必要があります。分離スコープを入力した後、ハンドルスコープを入力します。

于 2012-05-09T11:46:07.763 に答える