c - Pthreads - 内存不足?

标签 c linux unix pthreads stack-overflow

我正在用 C 编写一些东西,在 Linux 中创建大量 Pthread。

当我用少量线程运行程序时,它可以正常工作,但是一旦我让它创建大约 1000 个线程,它就会出错。现在设置了 errno 标志,但我想知道是哪个问题导致的。 EAGAINEINVALELEMULTITHREADFORKENOMEM

有什么方法可以确定它是否是这些错误之一,如果是,它是哪一个?

最佳答案

我相信您正在寻找的是 pthread_attr_setstacksize 函数。默认情况下,glibc 为每个线程的堆栈保留 2MB、8MB 或 10MB 或内存。以这种速度,您将很快耗尽 32 位机器上的虚拟地址空间,并且即使在 64 位机器上也会很快耗尽提交费用。

pthread_t td;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 32768);
pthread_create(&td, &attr, start_function, start_art);
pthread_attr_destroy(&attr);

这段代码过于简单;自然地,您可能希望检查其中一些调用是否失败。其实这就是你最初的问题。 pthread_*函数几乎所有的返回错误代码作为它们的返回值而不是在errno中,所以errno不能用于检查结果,除非将返回值分配给 errno,否则 perror 将不起作用。相反,做类似的事情:

result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}

关于c - Pthreads - 内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585292/

相关文章:

c - SDL2 事件在 C 中不起作用

c - 如何在c中的字符数组中用strtok划分单词

C 中的 SQL 解析器

C程序列出隐藏文件和只读文件

c - brk 和 sbrk 代表什么?

当在 Unix 系统中给出完整的 Web 路径时,PHP move_uploaded_file 不上传图像

linux - 复制 screenlog.n 文件并重新启动日志?

c - 在同一个进程中,同一个文件的多个 MAP_PRIVATE 映射仍然是私有(private)的吗?

node.js - 如何使用 Node.js 将 wifi 凭据添加到 wpa_supplicant?

node.js - 在前台启动 redis 并使用一个命令并行但串行地启动 Node 服务器