pthread_create因EAGAIN而失败

时间:2017-11-02 14:46:12

标签: c linux pthreads

考虑这里的代码片段,我试图创建一堆线程,最终处理模拟竞争条件的给定任务。

const int thread_count = 128;
pthread_t threads[thread_count];

for (int n = 0; n != thread_count; ++n)
{
    ret = pthread_create(&threads[n], 0, test_thread_fun, &test_thread_args);
    if( ret != 0 )
    {
        fprintf( stdout, "Fail %d %d", ret, errno );
        exit(0);
     }
 }

事情一般都很好,除非偶尔pthread_create因errno EAGAIN“资源暂时不可用”而失败,我试着诱导睡眠,然后重试创建但没有实际效果。

失败是零星的,在某些方面没有失败,有些则经常发生。

任何想法会出现什么问题?

  

编辑 - 1

更新max-threads

cat /proc/sys/kernel/threads-max
256467
  

编辑2

我认为这里的输入让我思考,我可能会在下面发表并发布任何值得分享的结果。

  1. 将堆栈大小设置为最小值,我认为thread_function不使用任何大型数组。
  2. 增加记忆力和交换(并消除任何副作用)
  3. 编写一个脚本来监视系统行为,并在运行此案例时看到任何其他进程/系统守护程序正在干扰,这反过来会导致资源崩溃。
  4. 系统的硬限制和软限制相当高,所以我会保留它们,因为它们就在这一点上。

4 个答案:

答案 0 :(得分:1)

您可能对每个进程的最大线程数有系统限制。试着看看它: cat /proc/sys/kernel/threads-max

答案 1 :(得分:1)

如果你的程序确保它永远不会创建比系统限制允许的更多的线程(通过在创建新线程之前加入线程),那么你可能会遇到这个内核错误:

对于某些类型的容器技术,竞赛窗口看起来要大得多,并且错误更容易触发。 (这可能取决于使用的cgroup类型。)

答案 2 :(得分:0)

在你的shell上查看ulimit -a。您可能在登录策略中设置了进程限制,并且Linux也可以将其应用于线程。

答案 3 :(得分:0)

没有足够的资源来启动新线程。 检查系统上是否有僵尸线程,或者系统上是否有足够的内存等。