Javascript 在WebAssembly中将数组作为参数传递时的线程安全性?[电子脚本]
另外,当从JS向Emscripten编译的C/C++函数传递数组时,我们实际上是将数组放入JS模拟堆(如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()来动态管理每个线程的堆空间?如果是这样,这听起来像是一个潜在的性能瓶颈,因为在阵列复制和空间分配/释放方面的努力可能会损害我们从使
Module.HEAPU8
),该堆由JS代码和C/C++代码共享
这在单线程环境中运行良好,但在多线程环境(如辅助线程)中又如何呢?是否有一些内置机制来保证这个模拟堆的线程安全
如果不是,这是否意味着我们需要调用模块.\u malloc()
和模块.\u free()
来动态管理每个线程的堆空间?如果是这样,这听起来像是一个潜在的性能瓶颈,因为在阵列复制和空间分配/释放方面的努力可能会损害我们从使用工作线程中获得的好处
参考:您的理解是正确的,但目前无法跨工作人员共享
WebAssembly.Memory
。JavaScript已经发布了,但是WebAssembly还不支持等价的(和兼容的)
一旦它得到支持,您将能够postMessage
aWebAssembly.Memory
,并使用它跨Worker实例化多个模块。您还可以postMessage
底层的SharedArrayBuffer
,并与WebAssembly一起使用JavaScript对其进行读/写操作
在所有这些情况下,它们的内存都不会被复制。未指定WebAssembly
malloc
/free
实现,但您将从例如Emscripten中获得的是线程安全的。最初它不会使用grow\u memory
(目前的设计不允许增加共享内存),而是会预先分配并确保线程安全(就像任何多线程C实现一样)。感谢您的详细解释:)