我正在尝试使用std :: thread。
main.cpp
int main()
{
std::cout << "Welcome WASM!" << std::endl;
std::cout << "Main thread=" << std::this_thread::get_id() << std::endl;
auto a2 = std::thread([](){
std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl;
unsigned int i = 0;
while (i < 100) {
std::cout << i++ << '\n';
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
});
a2.detach();
}
编译:
emcc -O2 -std=c++17 -s USE_PTHREADS=1 -o build\main.js main.cpp
此命令生成main.js,main.worker.js和main.wasm。我的HTML使用main.js
<script src="main.js"></script>
但是我在main.worker.js中遇到错误:
解决方案参考:https://emscripten.org/docs/compiling/WebAssembly.html#web-server-setup
找到了解决方案,问题出在我用来提供文件(HTML / js / wasm)的Web服务器上。之前我通过命令python -m SimpleHTTPServer 8000
运行这是通过MIME类型“ text / pain”提供所有文件(js / wasm)的功能,而chrome浏览器只是拒绝了它(我们可以在dev工具的屏幕截图中看到它)。 Chrome预期wasm和js文件的application / wasm和application / javascript MIME类型。
由StackOverflow伙伴之一建议,现在,我正在运行Web服务器,该服务器使用MIME类型的application / wasm和WAS文件提供WASM文件。现在所有错误都消失了,我可以同时使用std :: thread和std :: async了。 server.pyimport SimpleHTTPServer
import SocketServer
PORT = 8000
class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass
Handler.extensions_map['.wasm'] = 'application/wasm'
Handler.extensions_map['.js'] = 'application/javascript'
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
main.cpp
int main()
{
std::cout << "Welcome WASM!" << std::endl;
std::cout << "Main thread=" << std::this_thread::get_id() << std::endl;
auto f = std::thread([](){
std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl;
unsigned int i = 0;
while (i < 100) {
std::cout << i++ << '\n';
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
});
f.detach();
}
编译命令
emcc -std=c++17 --bind -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -s PROXY_TO_PTHREAD=1 -s TOTAL_MEMORY=1073741824 -o build\main.js main.cpp -s ASSERTIONS=1