最大线程数的学习

测试系统:centos 64位

首先提供测试程序,改写自linux程序设计的例子

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

void *thread_function(void *arg);

char message[] = "Hello World";

int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;
	int thread_num = 0;
	while(1)
	{
		res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
		if (res != 0) {
			perror("Thread creation failed");
			break;
		}
		thread_num++;
	}
    printf("thread_num = %d\n", thread_num);
	 sleep(1000);
   return -1;
}

void *thread_function(void *arg) {
//    printf("thread_function is running. Argument was %s\n", (char *)arg);
    sleep(1000);
    pthread_exit("Thank you for the CPU time");
}

例子中打印最大可以开启的线程数

运行该程序,得到如下结果

[zy@localhost ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7761
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[zy@localhost ~]$ ps aux | grep zy
zy        2421  0.0  0.4 218232  4616 ?        S    06:15   0:01 smbd -D
root      2440  0.0  0.3  99948  3936 ?        S    06:19   0:00 sshd: zy [priv]  
zy        2459  0.0  0.1  99948  1744 ?        S    06:19   0:00 sshd: zy@pts/0   
zy        2460  0.0  0.1 108524  1968 pts/0    Ss+  06:19   0:00 -bash
root      5791  0.0  0.3  99948  3940 ?        S    06:22   0:00 sshd: zy [priv]  
zy        5794  0.0  0.1  99948  1728 ?        S    06:22   0:00 sshd: zy@pts/1   
zy        5795  0.0  0.1 108524  1956 pts/1    Ss+  06:22   0:00 -bash
root     20533  0.0  0.3  99948  3940 ?        S    07:57   0:00 sshd: zy [priv]  
zy       20535  0.0  0.1  99948  1728 ?        S    07:57   0:00 sshd: zy@pts/3   
zy       20536  0.0  0.1 108520  1900 pts/3    Ss   07:57   0:00 -bash
root     20635  0.0  0.1 161096  1920 pts/3    S    08:05   0:00 su zy
zy       20637  0.0  0.1 108524  1952 pts/3    S    08:05   0:00 bash
zy       22779  1.0  0.1 110288  1144 pts/3    R+   08:08   0:00 ps aux
zy       22780  0.0  0.0 103300   848 pts/3    S+   08:08   0:00 grep zy
[zy@localhost ~]$ ./main          
Thread creation failed: Resource temporarily unavailable
thread_num = 1015
^C
[zy@localhost ~]$ ulimit -u 500
[zy@localhost ~]$ ./main       
Thread creation failed: Resource temporarily unavailable
thread_num = 491
从图中可以看到最大线程数由ulimit决定,当然这里使用的是64位系统,如果使用32位系统,该问题还与内存地址空间有关系。详细可以参考如下文章: Linux系统最大进程数和单进程最大线程数

此外,注意的是最大线程数的限制仅用于单个用户,如果系统存在多个用户,那么每个用户创建的线程数(进程数)是有用户的ulimit配置决定大的,就是说不同用户是相互独立的

但是如果切换到root用户,明显发现线程数量不受ulimit的限制,如下:

[root@localhost zy]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7761
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost zy]# ./main
Thread creation failed: Resource temporarily unavailable
thread_num = 15300


猜你喜欢

转载自blog.csdn.net/dyingfair/article/details/79661264