当前位置: 首页 > 知识库问答 >
问题:

pthread_create可以创建的最大线程数是多少?[复制]

牧熙云
2023-03-14

可能重复:
pthread\u创建的线程是否与内核线程相同?

我使用下面的代码来测试pthread_create函数可以创建的最大线程数。

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

static unsigned long long thread_nr = 0;

pthread_mutex_t mutex_;

void* inc_thread_nr(void* arg) {
    (void*)arg;
    pthread_mutex_lock(&mutex_);
    thread_nr ++;
    pthread_mutex_unlock(&mutex_);

    /* printf("thread_nr = %d\n", thread_nr); */

    sleep(300000);
}

int main(int argc, char *argv[])
{
    int err;
    int cnt = 0;

    pthread_t pid[1000000];

    pthread_mutex_init(&mutex_, NULL);

    while (cnt < 1000000) {

        err = pthread_create(&pid[cnt], NULL, (void*)inc_thread_nr, NULL);
        if (err != 0) {
            break;
        }
        cnt++;
    }

    pthread_join(pid[cnt], NULL);

    pthread_mutex_destroy(&mutex_);
    printf("Maximum number of threads per process is = %d\n", thread_nr);
}

输出是:

Maximum number of threads per process is = 825

这是pthread_create函数可以创建的最大线程数吗?

此外,我使用以下命令查看系统允许的最大线程数:

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

号码是772432。

为什么我的程序的输出不等于threads-max的值?

我的操作系统是Fodaro 16,12核,48G RAM。

共有3个答案

潘坚白
2023-03-14

根据手册页中的pthread\u create(3)还有另一个限制:

RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number 
of process  for  a real user ID.

尝试使用getrlimit(2)查找此限制的值。如果该值仍然与您测量的数字(825)不匹配,请尝试使用setrlimit(2)更改此限制,以验证它是否影响您的测量。

编辑:事实上,RLIMIT_NPROC限制值与使用shell命令ulimited-u(打印/设置最大用户进程)获得的限制值相同。

林涵映
2023-03-14

理论上,一个进程可以拥有的线程数没有限制。但实际限制可能来自所有线程共享资源的事实。

这意味着在某个时候,一个进程不能创建超过一定数量的进程,例如,由于缺乏与此类堆栈空间共享的资源。

贺兴昌
2023-03-14

每个线程堆栈的默认大小是人为地在您的测试中施加限制。虽然给定进程的默认堆栈(初始线程)根据需要动态增长,但其他线程的堆栈的大小是固定的。默认大小通常非常大,大约2兆字节,以确保每个线程堆栈足够大,即使是病态情况(深度递归等)。

在大多数情况下,线程工作者只需要很少的堆栈。我发现,在我使用的所有体系结构上,只要不使用深度递归算法或大型局部变量(结构或数组),每个线程堆栈64k(65536字节)就足够了。

要显式指定每个线程的堆栈大小,请将您的main()修改为如下内容:

#define MAXTHREADS 1000000
#define THREADSTACK  65536

int main(int argc, char *argv[])
{
    pthread_t       pid[MAXTHREADS];
    pthread_attr_t  attrs;
    int  err, i;
    int  cnt = 0;

    pthread_attr_init(&attrs);
    pthread_attr_setstacksize(&attrs, THREADSTACK);

    pthread_mutex_init(&mutex_, NULL);

    for (cnt = 0; cnt < MAXTHREADS; cnt++) {

        err = pthread_create(&pid[cnt], &attrs, (void*)inc_thread_nr, NULL);
        if (err != 0)
            break;
    }

    pthread_attr_destroy(&attrs);

    for (i = 0; i < cnt; i++)
        pthread_join(pid[i], NULL);

    pthread_mutex_destroy(&mutex_);

    printf("Maximum number of threads per process is %d (%d)\n", cnt, thread_nr);
}

请注意,pthread\u create()调用不会使用attrs。把线程属性想象成一个模板,说明pthread\u create()应该如何创建线程;它们不是给定给线程的属性。这会让许多有抱负的pthreads程序员大吃一惊,因此这是您最好一开始就做好的事情之一。

至于堆栈大小本身,它必须至少是PTHREAD\u stack\u MIN(我相信Linux中是16384),并且可以被sysconf(\u SC\u PAGESIZE)整除。由于页面大小在所有体系结构上都是二的幂,所以使用足够大的二的幂应该总是可行的。

此外,我还添加了一个补丁。您只尝试加入一个不存在的线程(循环试图创建但失败的线程),但您需要加入所有线程(以确保它们都完成了任务)。

进一步建议的修复程序:

不要使用睡眠,而是使用条件变量。让每个线程在条件变量上等待(pthread_cond_wait())(同时保持互斥锁),然后释放互斥锁并退出。这样,您的主函数只需要在条件变量上广播(pthread_cond_broadcast())来告诉所有线程它们现在可以退出,然后它可以加入每个线程,您可以确定该数量的线程确实同时运行。由于您的代码现在仍然存在,一些线程可能有足够的时间从睡眠中醒来并退出。

 类似资料:
  • 问题内容: 我使用下面的代码来测试pthread_create函数可以创建的最大线程数。 输出为: 那是pthread_create函数可以创建的最大线程数吗? 此外,我使用以下命令查看系统允许的最大线程数: 号码是772432。 为什么我的程序输出不等于值? 我的操作系统是Fodaro 16,具有12核,48G RAM。 问题答案: 每个线程堆栈的默认大小是在测试中人为施加的限制。当分配给进程的

  • ForkJoinPool是用给定的目标并行级别构造的;默认情况下,等于可用处理器的数量 假设我的CPU有2个内核。那么,ForkJoinpool创建的最大线程数是4? 假设我正在执行一个异步操作,该操作在使用默认Forkpool的循环(比如10k)操作中返回一个未来对象。。。那么Forkpool将创建多少线程? 而且,在其他一些类中,我正在检查是否所有的未来已经完成或没有:

  • java类或关联对象实例可以拥有的字段数量是否有限制?如果有,限制是什么? 我明确地问的是字段,而不是这个问题中所问的方法:一个Java类可以拥有的最大方法数是多少?

  • 执行者。newFixedThreadPool(5)在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程。 总共创建了105个线程?我原以为只创建了5个线程,但每个也是一个线程。

  • 本文向大家介绍linux创建线程之pthread_create的具体使用,包括了linux创建线程之pthread_create的具体使用的使用技巧和注意事项,需要的朋友参考一下 pthread_create函数 函数简介   pthread_create是UNIX环境创建线程函数 头文件   #include<pthread.h> 函数声明   int pthread_create(pthrea

  • 问题内容: 有谁知道您可以在Redis中存储的最大值是多少?我想将redis与celery一起用作消息队列,以存储一些需要由工作人员在另一台服务器上处理的小文档,并且我想确保这些文档不会太大。 我找到了一个引用1GB的页面,但是当我按照页面上的链接获取答案时,该链接不再有效。链接在这里: http://news.ycombinator.com/item?id=1182005 谢谢,肯 问题答案: