线程使用emscripten

use*_*088 6 pthreads emscripten

我正在尝试使用Emscripten的线程,我不明白它是如何工作的.我已经阅读了一些关于网络工作者的文章,我不太清楚.

当我查看"tests"文件夹时,我可以看到pthread的东西.

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

unresolved symbol: pthread_create
Run Code Online (Sandbox Code Playgroud)

我是否必须使用Web worker而不是默认线程?

谢谢!

Jos*_*ver 9

正在添加对pthread的支持,并且已经可以使用一些设置.由于std :: thread在引擎盖下使用pthread,你也可以使用它.有关更多信息,请参阅此讨论.

我必须做的事情:

  • 使用更新的emscripten(我正在测试1.34.1)
  • 每晚安装Firefox
  • 启用标志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();
}
Run Code Online (Sandbox Code Playgroud)

我已经能够在一个更大的项目中使用线程(对于这里的帖子来说很大!),所以它们是可行的.它们并不是那么快,我担心,尽管这可能随着时间的推移而改善.

建立它:

emcc main.cpp -o main.html -s USE_PTHREADS = 1 --std = c ++ 11

Firefox Nightly 42.0a1(2015-07-16)输出:

预先分配1名工人为pthread产卵池.
预先分配1名工人为pthread产卵池.
预先分配1名工人为pthread产卵池.
我是个帖子!
我是个帖子!
我是个帖子!

  • 以后我可能会修改我的答案,但[这个问题](https://github.com/kripken/emscripten/issues/3636)有工作并行线程代码,并跟踪在Firefox夜间冻结. (2认同)

Cha*_*ria 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-讨论/gQQRjajQ6iY

  • 不再正确:https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY (7认同)