linux c 程序线程问题.
发布网友
发布时间:2023-07-24 03:14
我来回答
共3个回答
热心网友
时间:2024-11-24 06:27
linux 系统中单个进程的最大线程数有其最大的* PTHREAD_THREADS_MAX
这个*可以在 /usr/include/bits/local_lim.h 中查看。
对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的*,仅仅受限于系统的资源
这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M。
可以写一段简单的代码验证最多可以创建多少个线程
int main() { int i = 0; pthread_t thread; while (1) { if (pthread_create(&thread, NULL, foo, NULL) != 0) return; i ++; printf("i = %d\n", i); } }
试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN
在 nptl 上最多可以创建 382 个线程,之后就会返回 ENOMEM
这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。
那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程。
为了突破内存的*,可以有两种方法
1) 用 ulimit -s 1024 减小默认的栈大小
2) 调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小
要注意的是,即使这样的也无法突破 1024 个线程的硬*,除非重新编译 C 库
热心网友
时间:2024-11-24 06:28
创建线程是有上限的,你以为可以任意创建吗?
如果线程创建了很多,每个线程即使很简单,想要马上完成任务退出也是一件困难的事情,在加上上下文切换,一定会导致创建太多线程错误的出现的。
何况你没有清理线程状态。
热心网友
时间:2024-11-24 06:28
狄仁杰: 元芳楼上的回答你怎么看!,
元芳: 大人那不科学.
LZ,对于这种问题我只能说你对linux的线程一点都不了解.
去百度看看什么叫做线程的分离状态(detached state)吧.