代码之家  ›  专栏  ›  技术社区  ›  Prismatic

如何在线程中使用v8?

  •  7
  • Prismatic  · 技术社区  · 14 年前

    我试图在一个不是主线程的线程中使用来自c++的v8。就v8而言,没有多线程,所有v8对象都是在该线程中创建和销毁的。没有什么是并行运行的,也没有什么是共享的。当我从主线程运行程序时,一切都很好。当我在另一个线程中有v8的东西时,我在创建v8::HandleScope时会出现分段错误。

    我找不到任何关于v8如何实际解决线程问题的有用文档。搜索时经常会弹出“使用隔离物和储物柜”的说明,但我找不到任何关于如何做到这一点的例子。v8::Isolate上有一个API文档,但该页面上没有任何内容告诉我在特定情况下是否需要它们(我没有共享内存或并行执行)。v8::Locker()上的文档甚至没有关于类的用途的信息。项目中包含的样本也不处理任何这些问题。

    所以我的问题是。。。

    • 我需要在这里使用隔离物和/或储物柜吗?
    • 我能得到一个如何使用它们的最简单的例子吗?即使是伪代码或其他东西也会非常有用
    1 回复  |  直到 10 年前
        1
  •  2
  •   Jason D.    13 年前

    在调用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本地变量一创建库就崩溃的问题。