我正在尝试在Emscripten中使用线程,但我不理解它的工作原理。我阅读了一些关于Web Workers的文本,但我不确定是否理解正确。
当我查看“tests”文件夹时,我可以看到pthread相关内容。
我正在使用“std :: thread”,并收到以下错误:
unresolved symbol: pthread_create
我是否必须使用Web Workers而不是默认线程?
谢谢!
我正在尝试在Emscripten中使用线程,但我不理解它的工作原理。我阅读了一些关于Web Workers的文本,但我不确定是否理解正确。
当我查看“tests”文件夹时,我可以看到pthread相关内容。
我正在使用“std :: thread”,并收到以下错误:
unresolved symbol: pthread_create
我是否必须使用Web Workers而不是默认线程?
谢谢!
支持pthread正在添加中,需要进行一些设置后就可以使用了。由于std :: thread在内部使用pthread,因此您也可以使用它。有关更多信息,请参见此讨论。
我所做的:
我曾经遇到过编写实际运行的pthread示例的麻烦,但以下使用std :: thread的代码演示了基本功能,对我很有效:
// main.cpp
#include <thread>
#include <iostream>
void func()
{
std::cout << "I'm a thread!\n";
}
int main()
{
std::thread test1(func);
std::thread test2(func);
std::thread test3(func);
// join seems to lock up the browser
//test1.join();
//test2.join();
//test3.join();
}
我已经在一个较大的项目中使用线程(太大了,无法在此发布),所以它们是可行的。不过,它们并不是非常快,但这可能会随着时间的推移而改善。
构建方法:
emcc main.cpp -o main.html -s USE_PTHREADS=1 --std=c++11
Firefox Nightly 42.0a1 (2015-07-16) 输出:
为 pthread 池预分配 1 个工作线程。
为 pthread 池预分配 1 个工作线程。
为 pthread 池预分配 1 个工作线程。
我是一个线程!
我是一个线程!
我是一个线程!
很遗憾,Emscripten无法编译多线程代码。Web Worker允许同时计算,但它们无法维护共享状态,因此不能替代线程。
参见:http://kripken.github.io/emscripten-site/docs/porting/guidelines/portability_guidelines.html
编辑:正如其他人所指出的,自我的原始回答以来,Emscripten正在向前发展,现在支持pthreads(很可能很快支持C++内置线程)https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY