2012-05-09 28 views
0

我是新的谷歌V8,我不確定如何充分使用它們提供的變量類型。我將首先解釋我想流向的內容:V8實例化變量的順序(多線程)

  1. 在主線程中我想編譯JS腳本。
  2. 在幾個線程中,當我使用實例 - > SetAccessor(...)或prototype-> Set(...)(或任何其他選項)添加到上下文時,我想運行腳本。

我不知道,當我需要做到以下幾點:

  • 何時何地創建v8::handleScope在主線程不夠或者我需要爲每個線程創建一個???
  • 何時何地創建v8::isolatev8::locker?應該按線程與否?應該在v8::handleScope之前還是之後?

任何信息將有助於(:

回答

1

如果你想從沒有跨線程共享的每個線程並行運行的腳本,則每個線程都需要自己孤立您可能會​​或可能不會實際需要。一個用於主線程,或者你可以使用默認的隔離區,我建議確保在運行任何線程之前已經初始化了默認隔離區,以防萬一其他線程結束初始化。好吧,如果你使用的是隔離物,但它不會造成任何傷害

如果你需要跨線程共享對象等,那麼你需要研究這個這很可能很困難。甚至不知道v8是否真的可以支持它。分開隔離並避免共享對象要容易得多。

您應該能夠在針對要在主線程中執行該線程的隔離區的上下文中編譯腳本,然後將該腳本和隔離區傳遞給該線程,而不是再次觸摸主線程,直到工作線程完成它。這應該可以工作,但我沒有檢查v8是否檢查隔離區創建的線程標識以及它執行的線程標識。值得編寫一個小測試應用程序來檢查它是否可行。

另一種方法是在主線程中檢查編譯並在工作線程中再次編譯並在線程中封裝隔離。這是我過去的做法。它更容易但效率更低。

句柄範圍應該僅在需要它的函數中分配在堆棧上。不要爲句柄範圍使用全局變量,也不要在堆上分配它。 您編譯的腳本應該使用持久句柄。 輸入隔離範圍後輸入句柄範圍。

+0

關於你的答案的一個問題:你在說'你的編譯腳本應該使用持久句柄',但'v8 :: Script :: New'返回一個本地句柄。我如何編譯腳本並將其保存在持久句柄中? –

+0

發現它,謝謝你,你的提示以正確的方式指引我。 –