9

我正在用 C 编写一些东西,它在 256Mb 系统上的 Linux 中创建了很多 Pthread。我通常有 +200Mb 的免费空间。

当我用少量线程运行程序时,它可以工作,但是一旦我让它创建大约 100 个线程,它就会出错,因为系统内存不足。我做了几个测试,每个线程都使用了将近 2Mb。线程的堆栈大小设置为 16Kb。

我用来创建每个线程的代码:

pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stacksize;
stacksize = (double) 16*1024;
int res = pthread_attr_setstacksize (&attr, stacksize);
int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (res != 0 || res2 != 0) {
    logs << "pthread_attr_XX: error "+int2string(res);
    exit(-1);
}
pthread_t id;
pthread_create(&id, &attr, &Class::thread_callback, &some_var);

这是正常的还是我错过了什么?谢谢。

4

6 回答 6

4

不确定它是否会有所帮助,但在创建第一个线程之前尝试调用setrlimitRLIMIT_STACK将堆栈大小限制为 16k。

于 2011-08-30T06:28:55.957 回答
2

系统线程库并非旨在支持内存非常有限的系统上的大量线程。您需要使用为此目的设计的线程库,或者更好地使用更少的线程。

于 2011-08-30T13:27:15.760 回答
1

是的,几乎任何操作系统都会在这么多线程上阻塞和死机,这是相当普遍的。这不是操作系统制造商(Linux 或其他)所关注的问题,因为很少有系统拥有这么多 CPU,因此使用 100 个线程的代码执行速度可能不会比使用 8 个线程(或者你有多少 CPU)快得多有)。

我认为您需要做的是某种线程池。我也怀疑如果你真的需要那么多线程,这个页面上的 ulimit 答案会很有用,但就像我说的,我认为在大多数情况下,很多线程不会让你得到很多,如果你在程序中而不是在程序中修复它系统,它将使其更便携。

于 2011-08-30T00:41:12.933 回答
1

为什么stacksize = (double) 16*1024;?它是整数。

尝试将其设置为 32 或 64 KB,因为可能不允许 16*1024;堆栈中也可以有 TLS(即使您不使用 TLS;库会使用,包括 libc)。

因此,将行更改为

stacksize = 64*1024; 

并检查消耗了多少内存。

于 2011-08-30T01:07:35.767 回答
0

如果您想降低开销,请考虑用户空间线程技术,例如光纤、ala 协作任务管理。

http://en.wikipedia.org/wiki/Fiber_(computer_science)

http://www.evanjones.ca/software/threading.html

GNU 可移植线程:

http://www.gnu.org/software/pth/

Boost C++ 协程:

http://www.boost.org/doc/libs/1_60_0/libs/coroutine/doc/html/index.html

仅供参考的仅 Windows 光纤:

http://msdn.microsoft.com/en-us/library/ms682661(v=vs.85).aspx

有关更多示例实现,请参阅 Wikipedia 链接。

于 2011-08-30T04:30:57.933 回答
-2

可能是这个原因:

"(识别泄漏

如果您创建了一个可加入线程但忘记加入它,它的资源或私有内存将始终保留在进程空间中并且永远不会被回收。始终加入可连接的线程;如果不加入他们,您将面临严重的内存泄漏风险。)”

在这里阅读:http: //www.ibm.com/developerworks/library/l-memory-leaks/

于 2015-04-03T10:00:24.090 回答