V8实例化变量的顺序(多线程)

时间:2012-05-09 10:08:06

标签: c++ v8 cvv8

我是谷歌V8的新手,我不确定如何充分利用他们提供的变量类型。我将首先解释我希望流向的内容:

  1. 在主线程中我想编译JS脚本。
  2. 在几个线程中,当我使用instance-> SetAccessor(...)或prototype-> Set(...)(或任何其他选项,如果有)添加“上下文”时,我想运行脚本是
  3. 我不确定何时需要执行以下操作:

    • 在何时何地创建v8::handleScope?在主线程中创建一个就足够了吗?或者我为每个帖子需要一个?
    • 在何时何地创建v8::isolatev8::locker?它应该是每个线程吗?它应该在v8::handleScope之前还是之后?

    任何信息都会有所帮助(:

1 个答案:

答案 0 :(得分:1)

如果要在没有跨线程共享的情况下从每个线程并行运行脚本,则每个线程都需要自己的隔离。您可能或可能不需要主线程,或者您可以使用默认隔离。我建议在运行任何线程之前确保已初始化默认隔离,以防万一其他线程最终初始化它。如果你使用的是隔离物,你应该没问题,但确保它不会造成任何伤害。

如果您需要跨线程共享对象等,那么您需要对此进行研究,这可能很困难。甚至不确定v8是否能真正支持它。拥有单独的隔离区并避免共享对象要容易得多。

您应该能够在一个隔离的上下文中编译脚本,该隔离用于将在主线程中执行它的线程,然后将脚本和隔离内容传递给线程,而不是再次触及主线程线程,直到工作线程完成它。这应该可以工作,但是我没有检查v8是否检查了隔离区创建的线程ID以及它执行的隔离区。值得编写一个小测试应用程序来检查这是否有效。

另一个选项是检查主线程中的编译并在工作线程中再次编译它并将隔离封装在线程中。这就是我过去的做法。它更容易但效率更低。

只应在需要的函数中在堆栈上分配句柄作用域。不要将全局变量用于句柄作用域或在堆上分配它。 您编译的脚本应该使用持久句柄。 输入隔离范围后输入句柄范围。