在 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 可能会损害我们从使用工作线程中获得的好处。
您的理解是正确的,但目前无法跨工作人员共享 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 实现一样)。
AFAIK,当将数组从 JS 传递给 Emscripten 编译的 C/C++ 函数时,我们实际上是将数组放入 JS 模拟堆(如 Module.HEAPU8
),它由 JS 共享代码和 C/C++ 代码。
这在单线程环境中运行良好,但在多线程环境(如工作线程)中如何?是否有一些内置机制来保证此模拟 HEAP 的线程安全?
如果不是,是否意味着我们需要调用Module._malloc()
& Module._free()
来为每个线程动态管理堆space?如果是这样,这听起来像是一个潜在的性能瓶颈,因为数组复制的工作量和 space allocation/free 可能会损害我们从使用工作线程中获得的好处。
您的理解是正确的,但目前无法跨工作人员共享 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 实现一样)。