Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SpiderMonkey是线程安全的是什么意思?_Javascript_C++_C++11_Mozilla_Spidermonkey - Fatal编程技术网

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

Javascript SpiderMonkey是线程安全的是什么意思?,javascript,c++,c++11,mozilla,spidermonkey,Javascript,C++,C++11,Mozilla,Spidermonkey,我可以将SpiderMonkey构建为一个库,并将其作为我的C++应用程序中的JavaScript引擎使用。 在文档中指定SpiderMonkey是线程安全的,但这意味着什么,因为Javascript/Ecmascript目前甚至没有线程模型。用这个关于SpiderMonkey的短语,什么样的调用或表达式被限定为“安全的”?它只是一块C++代码,调用任何C++线程的JS功能到JavaScript虚拟机? < P>它是关于C++应用的线程安全。您可以从C++代码中的多个线程使用库,而不必担心锁定数

我可以将SpiderMonkey构建为一个库,并将其作为我的C++应用程序中的JavaScript引擎使用。
在文档中指定SpiderMonkey是线程安全的,但这意味着什么,因为Javascript/Ecmascript目前甚至没有线程模型。用这个关于SpiderMonkey的短语,什么样的调用或表达式被限定为“安全的”?它只是一块C++代码,调用任何C++线程的JS功能到JavaScript虚拟机?

< P>它是关于C++应用的线程安全。您可以从C++代码中的多个线程使用库,而不必担心锁定数据结构等。 在这种情况下,库做什么无关紧要(在您的例子中,执行JS代码)。重要的是库本身可以在多线程环境中使用

来自维基百科:

在以下情况下,保证实现不受竞争条件的影响: 由多个线程同时访问


库的线程安全意味着库可以在多线程环境中使用与JavaScript语言模型无关。 但是某些规则和限制适用。这些规则令人困惑,因为它们一直在从一个版本的库更改到另一个版本,文档对它们不是也仍然不是很清楚。 文档页面通常会显示注释,如:“已弃用,因为…”或“正在起草…”或“未找到404”

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

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

你可以考虑建立一个<强>调试/<强>版本的蜘蛛猴来测试你的集成。尝试使用标志:

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

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

JavaScript本身没有线程,但JS编译器/解释器几乎肯定有线程。但这一切都离题了。@cHao是的,但是,关于这一断言的实质细节是什么?作为C++程序员(C++ 11/C++ 14),我该如何看待这个短语?P如果结果是真的,这意味着库处理任何需要的同步。但是,如果你的应用程序只使用一个线程,那么同步就没有多大意义。@我将在我的应用程序中使用任务模型或多线程队列,因此它肯定是多线程的,这就是为什么它对我有影响的原因,例如LUA看起来并没有提供线程安全的选项,V8显然也没有,这就是为什么我对SpiderMonkey感兴趣,但我仍然需要理解“线程安全”是关于什么的。它意味着线程安全在其他任何地方都意味着什么——你不必担心多个线程同时使用库。库将处理调用线程之间的同步。谢谢,但您的答案似乎不是关于SpiderMonkey,我知道threadsafe的一般含义,但如果Mozilla的意思是threadsafe仅与JS虚拟机中使用的线程相关,该怎么办?你确定你在谈论SpiderMonkey引擎的规格吗?@user2485710:如果他们说它是线程安全的,那么他们最好编写使用它的代码。如果他们是别的什么,他们是无能的。@从这个前景来看,C++和JS代码都可以使用“蜘蛛猴”,我还没有找到任何与这个线程安全相关的例子。我的意思是,这是SpiderMonkey的一个独特方面,其他脚本语言的许多其他VM都不提供这种独特的功能,而且在细节中甚至没有记录?@user2485710:考虑到JS没有线程,它本身不会有竞争条件。显然,C++代码关心线程安全,C++代码最好能信任这样的保证,如果它被授予的话,那么我也假设内部使用互斥作为同步机制。这意味着Spidermonkey的执行在内部会阻塞给定的线程,直到该操作被执行为止。即使我在一个单独的线程中运行spidermonkey,当我调用SM时,我的应用程序也会被它的互斥锁阻塞。@user2485710使用什么机制进行同步并不重要。除非所有线程都调用SM,否则SM不会阻止您的应用程序。如果他们这样做,他们可能会开始争夺共享资源。如果您只有一个SM线程,那么其他线程就没有什么可竞争的了,除非它们被阻塞,等待冗长的JavaScript完成。