蜘蛛猴是线程安全的是什么意思

What does it mean that SpiderMonkey is threadsafe?

本文关键字:是什么 意思 安全 线程      更新时间:2023-09-26

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

在文档中指定了SpiderMonkey是线程安全的,但是这意味着什么,因为Javascript/Ecmascript目前甚至没有线程模型。什么样的呼唤或表达方式被定性为"安全"的这句话关于蜘蛛猴?这只是一段C++代码,从任何C++线程调用任何JS功能到Javascript虚拟机?

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

但是,某些规则和限制适用。这些规则令人困惑,因为它们已经从一个版本的库更改为另一个版本,并且文档过去和现在都不是很清楚。文档页面通常显示如下注释:"自此弃用..."或"草稿正在进行...",或"未找到 404"。

从壁虎12.0或蜘蛛猴24开始,规则是:

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

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

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

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

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

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

来自维基百科:

在以下情况下,实施保证没有竞争条件 由多个线程同时访问。

在维基百科中阅读有关线程安全的更多信息。