线程使用emscripten

时间:2014-12-14 20:52:35

标签: pthreads emscripten

我试图在Emscripten中使用线程,但我不明白它是如何工作的。我已经阅读了一些关于网络工作者的文章,我不确定。

当我看一下"测试"文件夹,I can see pthread stuff

我正在使用" std :: thread"并得到以下错误:

unresolved symbol: pthread_create

我是否必须使用网络工作者而不是默认线程?

谢谢!

2 个答案:

答案 0 :(得分:9)

正在添加对pthread的支持,并且已经可以使用一些设置。由于std :: thread在引擎盖下使用pthread,你也可以使用它。有关详细信息,请参阅this discussion

我必须做的事情:

  • 使用较新的emscripten(我使用1.34.1进行测试)
  • 安装Firefox Nightly
  • 启用 USE_PTHREADS
  • 标志
  • 请注意,这是实验性的,有些事情很挑剔

我在编写一个实际运行的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每晚输出42.0a1(2015-07-16):

  

为一个pthread产卵池预分配1名工人   预先分配1名工人为pthread产卵池   预先分配1名工人为pthread产卵池   我是一个线程!
  我是一个线程!
  我是一个线程!

答案 1 :(得分:2)

不幸的是,无法使用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