質問: ローカルストレージを偽装/ハッキングする可能性がありますか? 私はちょっとした喧嘩に苦しんでいる。 私はGoogleのV8のjavascriptエンジンを持っている大きなアプリケーションを持っています。いくつかの呼び出しは、UIスレッド上でV8エンジンに行われます。誰もが薦めるようにユーザーに親切にするために、いくつかの長い操作は、UIスレッドをハングすることなく別のスレッドで実行されます。しかし、これらの長時間実行される操作では、V8 javascriptエンジンを呼び出すこともあります。したがって、複数のスレッドがV8を呼び出します。 V8はスレッドローカルストレージを使用しているようです。これは私のアプリケーションをランダムに爆発させているようです。それは間違いなく「これまでどのように今まで働いていたのですか」というクラスにあります。バグ。 私のアプリケーションを大幅に再構築することなく、私は醜い、醜い恐ろしいスーパーハックを提案する:私はV8をそれが別のスレッドで動いていると思うようにすることはできますか? 言い換えれば、私が初めてV8に電話をかけたとき、私はそのスレッドを書き留めます。次に、 *V8への他のすべての呼び出し*のために、私は何とかスレッドをスプーフィングしてスレッドのローカルストレージ/スレッドに依存するその他のものをスプーフィングします。 それはできますか?それは働くでしょうか?私はそんな面白いハックを考えようとしても馬鹿ですか?
回答: あなたは何かを欺くべきではありません。代わりに、別のスレッドからV8を使用しようとしていることをV8に伝える必要があります。 In V8 prior to the version 3.2 the only way to do that is to use `v8::Locker` before using V8 from the different thread. It guarantees both *exclusive* access to the V8 and initializes internal structures stored in TLS. For more details see http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189 Starting from the version 3.2 V8 has the concept of *isolate*. If you are not creating isolates explicitly, V8 implicitly creates the default isolate to keep API compatible. In this case you can still simply use `v8::Locker` as in older versions. If you are creating isolates explicitly then in addition to acquiring exclusive access with `v8::Locker` you also have to enter&exit them explicitly in your threads using `v8::Isolate::Enter`/`v8::Isolate::Exit` methods or `v8::Isolate::Scope`. For more details see http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510 したがって、ほとんどの場合に有効な簡単な答えは、別のスレッドからV8を使用する前に `v8 :: Locker` を使用することです。