使用emscripten的线程

9

我正在尝试在Emscripten中使用线程,但我不理解它的工作原理。我阅读了一些关于Web Workers的文本,但我不确定是否理解正确。

当我查看“tests”文件夹时,我可以看到pthread相关内容

我正在使用“std :: thread”,并收到以下错误:

unresolved symbol: pthread_create

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

谢谢!


现在,在 Emscripten 上使用 pthreads 需要服务器上的头文件才能正常工作。https://dzone.com/articles/webassembly-threads-in-firefox https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer - eri0o
2个回答

11

支持pthread正在添加中,需要进行一些设置后就可以使用了。由于std :: thread在内部使用pthread,因此您也可以使用它。有关更多信息,请参见此讨论

我所做的:

  • 使用更新的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 Nightly 42.0a1 (2015-07-16) 输出:

为 pthread 池预分配 1 个工作线程。
为 pthread 池预分配 1 个工作线程。
为 pthread 池预分配 1 个工作线程。
我是一个线程!
我是一个线程!
我是一个线程!


3
我可能会稍后修改我的答案,但这个问题已经有了能够工作的pthread代码,并正在跟踪Firefox Nightly的冻结情况。 - Joshua Brookover

1

6
不再正确:https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY - Lightbeard
这个答案已经过时,因为emcc自2023年起已经完全支持pthreads。 - Michael IV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接