您可以使用 javascript 停止 WebAssembly 中当前的 运行 c++ 吗?

Can you use javascript to halt the currently running c++ in WebAssembly?

我用c++写了一个模拟,已经编译成wasm了。 javascript 使用 ccall 调用代码,这一切都发生在网络工作者中。一些 c++ 子例程采用 minutes/hours/days 到 运行。

有没有办法可以使用 javascript 告诉 WebAssembly 模块取消当前任务?我试过使用 stopWebAssembly() 函数:

    void EMSCRIPTEN_KEEPALIVE stopWebAssembly(){
        stop = true;
    }
    ...
    void simulate(){
        State* state = new State();
        while(!state->isTerminated() && !stop){
            // Perform operation on state

        }
    }

目的是调用 stopWebAssembly() 将取消模拟。但这不起作用。还有什么我可以做的吗?我能想到的最好的办法是return在while循环的每1000次迭代后返回js,看看javascript是否请求停止,但这似乎效率低下且笨拙。

为了通过 JavaScript 设置您的“停止”变量,WebAssembly 将不得不执行 - 这意味着将您的长 运行 计算变成一系列小块可以执行。

将来您可以使用 SharedArrayBuffer 作为两者之间通信的方式,但这取决于 WebAssembly 中即将推出的线程支持。参见:

https://github.com/WebAssembly/design/issues/950