【问题标题】:Simple multithreading program with emscripten带有 emscripten 的简单多线程程序
【发布时间】:2017-11-27 12:10:06
【问题描述】:

我正在尝试使用 Emscripten 创建一个支持线程的简单程序:

#include <stdio.h>
#include <pthread.h>

void *myThreadFun(void *vargp) {
  printf("From Thread \n");
  return NULL;
}

int main(int argc, char *argv[]) {

    pthread_t tid;
    printf("Before Thread\n");
    pthread_create(&tid, NULL, myThreadFun, NULL);
    printf("Before join\n");
    pthread_join(tid, NULL);
    printf("After Thread\n");

    return 0;
}

我在 Firefox 中执行它并使用 -s USE_PTHREADS=1 进行编译。 这是我在控制台中得到的输出:

Before Thread
Preallocating 1 workers for a pthread spawn pool.
Before join

但我期待:

Before Thread
Preallocating 1 workers for a pthread spawn pool.
Before join
After Thread

这就像线程没有结束。我错过了什么吗?

【问题讨论】:

  • 奇怪的是,Middle 在您的代码中从未存在时被打印出来......
  • 这是我运行上述代码后得到的输出,Before Thread Before join From Thread After Thread 不是你在代码中提到的。
  • 您上面的代码应该打印为 1. 在线程之前 2. 从线程 3. 在加入之前 4. 在线程之后。如果它像这样打印它工作正常。但什么是 SDL.h?在加入之前和从线程可能会以不同的顺序打印,这也很好。
  • 抱歉,我在从控制台粘贴结果时出错了。我编辑了这个问题。所以我得到了Before Thread and Before join,但我没有得到After Thread。 @LethalProgrammer,我正在使用 Emscripten,你呢?
  • return 0之前添加fflush(stdout);,它会自动工作。

标签: c multithreading emscripten


【解决方案1】:

我有同样的问题。我通过使用 x = 创建的线程数使用 -s PTHREAD_POOL_SIZE=x 进行编译来修复它。

【讨论】:

  • 谢谢!当我再次从事该项目时,我会尝试一下。实际上我放弃了使用线程,因为它大大减慢了我的程序。你有同样的行为吗?也许使用 PTHREAD_POOL_SIZE 可以解决问题?
  • 我不能告诉你,因为我没有测量任何东西。我只是想看看 emscripten 如何处理多线程代码。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2012-11-12
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
相关资源
最近更新 更多