在 WebAssembly 中将数组作为参数传递时的线程安全性? [Emscripten]

Thread-safety when passing array as argument in WebAssembly? [Emscripten]

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

这在单线程环境中运行良好,但在多线程环境(如工作线程)中如何?是否有一些内置机制来保证此模拟 HEAP 的线程安全?

如果不是,是否意味着我们需要调用Module._malloc() & Module._free()来为每个线程动态管理堆space?如果是这样,这听起来像是一个潜在的性能瓶颈,因为数组复制的工作量和 space allocation/free 可能会损害我们从使用工作线程中获得的好处。

参考ref1 ref2

您的理解是正确的,但目前无法跨工作人员共享 WebAssembly.Memory。 JavaScript 有 SharedArrayBuffer but WebAssembly doesn't yet support the equivalent (and compatible) WebAssembly.Memory with shared=true attribute.

一旦支持,您将能够 postMessage WebAssembly.Memory 并使用它在工作人员之间实例化多个模块。您还可以 postMessage 底层 SharedArrayBuffer,并使用 JavaScript 与 WebAssembly 同时读取/写入它。

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