Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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 在WebAssembly中将数组作为参数传递时的线程安全性?[电子脚本]_Javascript_C++_Browser_Emscripten_Webassembly - Fatal编程技术网

Javascript 在WebAssembly中将数组作为参数传递时的线程安全性?[电子脚本]

Javascript 在WebAssembly中将数组作为参数传递时的线程安全性?[电子脚本],javascript,c++,browser,emscripten,webassembly,Javascript,C++,Browser,Emscripten,Webassembly,另外,当从JS向Emscripten编译的C/C++函数传递数组时,我们实际上是将数组放入JS模拟堆(如Module.HEAPU8),该堆由JS代码和C/C++代码共享 这在单线程环境中运行良好,但在多线程环境(如辅助线程)中又如何呢?是否有一些内置机制来保证这个模拟堆的线程安全 如果不是,这是否意味着我们需要调用模块.\u malloc()和模块.\u free()来动态管理每个线程的堆空间?如果是这样,这听起来像是一个潜在的性能瓶颈,因为在阵列复制和空间分配/释放方面的努力可能会损害我们从使

另外,当从JS向Emscripten编译的C/C++函数传递数组时,我们实际上是将数组放入JS模拟堆(如
Module.HEAPU8
),该堆由JS代码和C/C++代码共享

这在单线程环境中运行良好,但在多线程环境(如辅助线程)中又如何呢?是否有一些内置机制来保证这个模拟堆的线程安全

如果不是,这是否意味着我们需要调用
模块.\u malloc()
模块.\u free()
来动态管理每个线程的堆空间?如果是这样,这听起来像是一个潜在的性能瓶颈,因为在阵列复制和空间分配/释放方面的努力可能会损害我们从使用工作线程中获得的好处


参考

您的理解是正确的,但目前无法跨工作人员共享
WebAssembly.Memory
。JavaScript已经发布了,但是WebAssembly还不支持等价的(和兼容的)

一旦它得到支持,您将能够
postMessage
a
WebAssembly.Memory
,并使用它跨Worker实例化多个模块。您还可以
postMessage
底层的
SharedArrayBuffer
,并与WebAssembly一起使用JavaScript对其进行读/写操作


在所有这些情况下,它们的内存都不会被复制。未指定WebAssembly
malloc
/
free
实现,但您将从例如Emscripten中获得的是线程安全的。最初它不会使用
grow\u memory
(目前的设计不允许增加共享内存),而是会预先分配并确保线程安全(就像任何多线程C实现一样)。

感谢您的详细解释:)