我正在开发一个搜索引擎,它应该在Visual Studio下编译,也可以使用Emscripten(cengine(编译到WebAssembly。核心代码运行良好。WebAssembly 模块在 Web worker 中运行,使用页面的 HTML 输入发出的命令作为消息发送给该 worker ,该 worker 具有使用 cwrap 调用 WebAssembly 模块的必要功能。
但是,当我想在 WebAssembly 代码中使用额外的线程时,我遇到了问题,以便在搜索期间,工作人员对传入的命令保持响应。
我的构建命令是这样的:
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 工作线程运行,当工作线程尝试调用搜索线程而不是执行代码时,我在消息处理程序中收到一条消息,如下所示:
{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 生成的代码应该。
我不知道该怎么办。
已解决。
我首先在worker中使用了代码以实现响应能力,因为worker在真正的线程中运行并且不会阻塞应用程序主线程。
但是,如果您使用 Emscripten pthread,那么这将为您处理,因此您可以将代码移回应用程序,而不是在 worker 中生成它。因此,您将Emscripten生成的胶水代码包含在索引中.html(顺便说一下,这是默认值(。
发生的事情是,我对一个问题使用了移位解决方案,对于该问题存在适当的解决方案,一旦您使用正确的解决方案,这就会与您的移位解决方案发生冲突。Emscripten 本质上是自己处理工作线程的创建,如果你在 build 命令中通过开关-s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2
来指导它。