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

Mic*_*mza 8 javascript c c++ web-worker emscripten

有没有办法让Emscripten在Web工作者和主UI线程之间传输而不是复制数据?

Emscripten有一个管理Web Workers之间通信API,我认为它只是使用了引擎盖下的postMessage/ onmessagemechanism.查看Emscripten Worker API的源代码,它似乎在调用时使用该transferList选项postMessage,因此数据将被复制.

实际上,我认为它至少被复制了两次:首先是线程之间的浏览器,然后是Emscripten第二次将它复制到Emscripten管理的堆空间中.如果您希望数据在回调后继续在接收端生存,则必须第三次复制,因为根据文档,传递给回调的数据仅保证在回调期间存在.

从顶部重复我的问题:有没有办法让Emscripten通过在Web worker和主UI线程之间传输而不是复制数据来避免所有这些复制?

Dea*_*con 1

如果您使用SharedArrayBuffer ,这是可能的。最近,Emscripten 人员在 Emscripten 中添加了对 pthread 的实验性支持,它使用了此功能。然而,目前只有 Firefox nightly 支持 SharedArrayBuffers,所以这还没有被广泛采用。