SpiderMonkey是线程安全的是什么意思?

时间:2014-11-15 02:41:56

标签: javascript c++ c++11 mozilla spidermonkey

我可以将SpiderMonkey构建为库,并将其用作我的C ++应用程序中的Javascript引擎。

在文档中指出SpiderMonkey是线程安全的,但是它的意思是什么,因为Javascript / Ecmascript目前甚至没有线程模型。什么样的电话或表达被认定为"安全"这个关于SpiderMonkey的短语?它只是一个C ++代码调用从任何C ++线程到Javascript虚拟机的任何JS功能?

2 个答案:

答案 0 :(得分:1)

对于您的C ++应用程序,它是线程安全的。您可以使用C ++代码中多个线程的库,而无需担心锁定数据结构等。

在这种情况下,它与库的作用无关(在您的情况下,执行JS代码)。重要的是库本身可以在多线程环境中使用。

来自维基百科:

  

保证实施时没有竞争条件   多个线程同时访问。

Read more about thread safety in Wikipedia.

答案 1 :(得分:1)

库的线程安全意味着库可以在多线程环境中使用。 SpiderMonkey库可以集成到多线程C ++应用程序中。这与JavaScript语言模型无关。

但适用某些规则和限制。这些规则令人困惑,因为它们已经从一个版本的库更改为另一个版本,并且文档不是并且仍然不是很清楚它们。 文档页面通常会显示以下注释:“自......以后不推荐使用”或“进行中的草稿...”或“未找到404”。

从Gecko 12.0或SpiderMonkey 24开始,规则是:

  • JSRuntime是单线程的。您只能从一个线程
  • 使用它
  • 要一次从多个线程调用库API,请使用多个JSRuntimes
  • 在JS_THREADSAFE构建中,必须只调用许多JSAPI函数 从请求中(JS_THREADSAFE现在永久开启)
  • 使用JS_BeginRequest,JS_EndRequest函数或支持API调用 使用JSAutoRequest类
  • Garbage Collector挂起调用SpiderMonkey的所有其他线程。要将等待时间降至最低,请避免长时间运行请求。不要在JS_BeginRequest,JS_EndRequest块中包含阻塞I / O或耗时的计算。

您可以考虑构建一个 debug 版本的SpiderMonkey来测试您的集成。尝试使用标志:

--enable-root-analysis --enable-debug --disable-optimize

那些在库代码中添加断言以帮助更早地捕获线程(垃圾收集器和内存)相关的问题。

相关问题