【问题标题】:pthread_create error code 11 even with a few threadspthread_create 错误代码 11 即使有几个线程
【发布时间】:2021-09-14 20:22:39
【问题描述】:

所以我的代码基本上是

pthread_t cpu[10];


while (a certain condition){

for (int i=0;i<10;i++){
   pthread_create(&cpu[i],NULL,(a function), NULL);
}

这段代码一次应该运行大约 10 个线程,但是,在运行 while 循环一定次数后,它说它们是代码 11 的 pthread 错误。我知道我正在多次运行线程,但不应该只发生 10 个实例?

【问题讨论】:

  • minimal reproducible example 会很有帮助。
  • 你有没有在你的线程上调用pthread_join()?如果没有,很可能你很快就堆积了很多泄漏的线程资源,很快你就会达到资源限制并出错。
  • @JeremyFriesner 我不会一直调用 pthread_join() 但我不希望我的程序等待线程完成
  • @mike91827 但是您仍然达到了资源限制,因为您在 while 循环中不断创建线程。要么停止创建线程,要么至少偶尔删除一些线程。
  • 你有一个限制。你超出了这个限制。你只想要10个线程?创造十个,而不是一千万。然后,如果您认为是时候删除这些线程,请通过调用 pthread_join 来完成它们。同时,做任何你认为应该做的事情。如果您想重用线程,请考虑线程池和工作线程(任务列表,每个线程一次处理一个)。

标签: c multithreading


【解决方案1】:

已达到线程限制,因为程序在循环中调用pthread_create(),不断产生更多线程,而从未调用pthread_join() 来清理现有线程的资源。这很快填满了进程的线程表,此时pthread_create() 开始出错,因为进程的线程表中没有更多空间可容纳更多线程。

为避免该问题,您需要修改代码,使其一次只调用有限(且合理——阅读:数十个,而不是数百或数千个)线程数。

实现此目的的简单调用模式如下所示:

pthread_t cpu[10];

while (a certain condition){

   // spawn 10 threads
   for (int i=0;i<10;i++){
      pthread_create(&cpu[i],NULL,(a function), NULL);
   }

   // at this point all 10 threads are running

   // wait until all 10 threads have exited
   for (int i=0;i<10;i++){
      pthread_join(&cpu[i], NULL);
   }
}

另一种常见(也更优雅)的方法是使用线程池而不是生成和连接线程。这通常更可取,因为它避免了不断创建然后拆除线程所需的开销,并且因为这意味着一旦线程完成计算作业 A,它可以立即从待处理作业队列中获取作业 B 并开始正在处理它 - 与上面显示的代码不同,它必须等待所有 10 个线程完成才能产生更多的 10 个线程。

【讨论】:

    【解决方案2】:
    #include <string.h>
    
    int main() {
        printf("%s\n", strerror(11));
        return 0;
    }
    

    在我的系统上提供:资源暂时不可用
    再次在我的系统上:EAGAIN 定义为 11 (errno.h)。

    man pthread_create 表示可能的错误返回代码:

    EAGAIN

    资源不足,无法创建另一个线程。

    EAGAIN

    遇到了系统对线程数施加的限制。有许多限制可能会触发此错误:...

    Jeremy Friesner 在上面的 cmets 部分已经回答了原因。

    【讨论】:

    • 仅供参考,在某些发行版的 moreutils 软件包中有一个 errno(1) 工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多