如何在由Emscripten创建的多线程WebAssembly模块驱动的web worker中运行一个线程?

问题描述 投票:0回答:1

我正在开发一个搜索引擎,它既可以在Visual Studio下编译,也可以使用Emscripten编译成WebAssembly ( 发动机 ). 核心代码非常好用。WebAssembly模块在Web Worker中运行,使用HTML输入的命令会以消息的形式发送给这个Worker,这个Worker有一个Javascript消息处理程序,使用cwrap调用WebAssembly模块的必要功能。

然而,当我想在WebAssembly代码中使用一个额外的线程时,我遇到了问题,这样在搜索过程中,worker会对输入的命令保持响应。

我的构建命令是这样的。

emcc src/attack.cpp src/bitboard.cpp src/cengine.cpp src/matein4.cpp src/piece.cpp src/search.cpp src/square.cpp src/state.cpp -s WASM=1 -s TOTAL_MEMORY=30MB -s ALLOW_MEMORY_GROWTH=1 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=1 -D WASM -o wasmbuild/cengine.html -s EXPORTED_FUNCTIONS="['_main','_execute_uci_command']" -s EXTRA_EXPORTED_RUNTIME_METHODS="['cwrap']"

这个编译没有问题 Web Worker运行后,当worker试图调用搜索线程时,我没有执行代码,而是在我的消息处理程序中得到了一条消息,比如:"你的搜索线程已经启动了,但你的搜索线程还在运行中。

{cmd: "run", start_routine: 11, arg: 0, threadInfoStruct: 25501264, selfThreadId: 25501264, …}
arg: 0
cmd: "run"
parentThreadId: 2295120
selfThreadId: 25501264
stackBase: 23404096
stackSize: 2097152
start_routine: 11
threadInfoStruct: 25501264
time: 3276.1050000008254
__proto__: Object

通常当模块被加载时,Emscripten会添加一个web worker来启动一个线程,并为此生成一个单独的输出文件,但我已经把模块作为一个web worker使用了,而我得到的消息是,Emscripten生成的代码应该...

我不知道该怎么办了。

multithreading webassembly emscripten
1个回答
0
投票

解决了。

我首先是为了响应性而在worker中使用了代码,因为worker是在真正的线程中运行的,不会阻塞应用主线程。

但是如果你使用Emscripten pthread,那么这一点就会被你照顾到,所以你可以把代码移回应用中,而不是在worker中生成。所以你把Emscripten生成的glue代码包含在index.html中(顺便说一下,这是默认的)。

事情是这样的,我使用了一个make shift解决方案来解决一个问题,而这个问题有一个合适的解决方案,一旦你使用合适的解决方案,就会和你的make shift解决方案发生冲突。如果你在构建命令中通过开关来引导,Emscripten基本上会自己处理worker的创建。-s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2.

© www.soinside.com 2019 - 2024. All rights reserved.