首页 > 解决方案 > 无法在 Firefox 中运行简单的 Emscripten 线程示例

问题描述

我想使用带有 Emscripten 的线程编译以下 C++ 片段

    #include <cstdio>
    #include <thread>
    
    void foo() { puts("foo\n"); }
    
    void bar(int x) { printf("bar %d\n", x); }
    
    int main(int argc, char* argv[]) {
      std::thread first(foo);
      std::thread second(bar, 123);
    
      puts("main, foo and bar now execute concurrently...\n");
    
      first.join();
      second.join();
    
      puts("foo and bar completed.\n");
    }

为了让 Emscripten 使用线程,我在编译和链接期间传递了“-s USE_PTHREADS=1”选项

  target_compile_options(
    Emscripten PRIVATE -v "SHELL:-s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=8")
  target_link_options(
    Emscripten PRIVATE -v --emrun
    "SHELL:-s MINIFY_HTML=0 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=8")

我还将编译输出的后缀更改为 .html,这会导致 Emscripten 直接生成一个 .html 页面

  set(CMAKE_EXECUTABLE_SUFFIX ".html")

到目前为止,一切都很好。该片段按预期编译,我可以看到工具链在命令行上传递了一些 pthread 参数。

为了测试输出,我用 python 启动了一个网络服务器,并用 Firefox 打开了 .html 页面。Firefox 选项javascript.options.shared_memory在我的版本 (78.0.1) 中默认启用,所以我认为我的代码应该开箱即用。可悲的是,情况并非如此,我得到了Uncaught ReferenceError: SharedArrayBuffer is not defined异常通过控制台向我抛出。

使用节点测试代码虽然有效:

$ node --experimental-wasm-threads --experimental-wasm-bulk-memory Emscripten.js
main, foo and bar now execute concurrently...

foo
bar 123

foo and bar completed.

/edit 好的,SharedArrayBuffer 似乎仍在经历一些标准化过程...... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/Planned_changes

标签: pthreadsemscripten

解决方案


推荐阅读