使用Emscripten Worker API传输数据而不进行复制

Transferring data using Emscripten Worker API without copying

本文关键字:复制 数据 Emscripten Worker API 传输 使用      更新时间:2023-09-26

有没有一种方法可以让Emscripten在web工作者和主UI线程之间传输而不是复制数据?

Emscripten有一个API来管理Web Workers之间的通信,我认为它只是在后台使用postMessage/onmessage机制。查找Emscripten Worker API的源代码时,它在调用postMessage时似乎没有使用transferList选项,因此数据会被复制。

事实上,我认为它至少被复制了两次:第一次是由浏览器在线程之间复制,第二次是由Emscripten将其复制到Emscripten管理的堆空间中。如果你想让数据在回调后在接收端继续存在,就必须第三次复制,因为根据文档,传递给回调的数据只能保证在回调期间存在。

从顶部重复我的问题:有没有一种方法可以让Emscripten通过在web工作者和主UI线程之间传输而不是复制数据来避免所有这些复制?

如果您使用SharedArrayBuffer,这是可能的。最近,Emscripten团队在Emscripten中添加了对pthread的实验性支持,使用了这一功能。然而,目前只有Firefox夜间版支持SharedArray Buffers,因此这还没有被广泛采用。