考虑这里的代码片段,我试图创建一堆线程,最终处理模拟竞争条件的给定任务。
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
我认为这里的输入让我思考,我可能会在下面发表并发布任何值得分享的结果。
答案 0 :(得分:1)
您可能对每个进程的最大线程数有系统限制。试着看看它:
cat /proc/sys/kernel/threads-max
答案 1 :(得分:1)
如果你的程序确保它永远不会创建比系统限制允许的更多的线程(通过在创建新线程之前加入线程),那么你可能会遇到这个内核错误:
对于某些类型的容器技术,竞赛窗口看起来要大得多,并且错误更容易触发。 (这可能取决于使用的cgroup类型。)
答案 2 :(得分:0)
在你的shell上查看ulimit -a
。您可能在登录策略中设置了进程限制,并且Linux也可以将其应用于线程。
答案 3 :(得分:0)
没有足够的资源来启动新线程。 检查系统上是否有僵尸线程,或者系统上是否有足够的内存等。