pthreads - 无法在 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
解决方案
推荐阅读
- google-apps-marketplace - 来自我的 Google 文档插件用户的“请求访问”消息
- python - 基于其他两个列值的逻辑的新列以查找异常值
- docker - Mac 上 Docker 的 Python 文件在哪里?
- php - 如何解决这个问题(数组到字符串的转换)
- r - ARIMA 拟合模型给出 NULL
- java - 如何迭代 Collection 并使用对象的方法?(不同的对象)
- forms - 隐藏谷歌表单域
- ruby - 无法安装 Postgres 'pg' gem
- c# - 通过脚本加载预制件并在 Unity 编辑器中保存场景
- python - scapy - srp 没有将我的数据包发送到正确的网络接口