Pthreads - 高内存使用率

时间:2011-08-29 21:01:36

标签: c linux multithreading pthreads memory-efficient

我在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);

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

6 个答案:

答案 0 :(得分:4)

不确定它会有所帮助,但尝试使用setrlimit调用RLIMIT_STACK以将堆栈大小限制为16k,然后再创建第一个线程。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

是的,几乎任何操作系统都会在很多线程上扼杀和死亡,这是相当普遍的。操作系统制造商(Linux或其他)已经非常关注这一点并不是问题,因为很少有系统拥有那么多CPU,所以你的代码在100个线程上的执行速度可能不会比8个(或者你的CPU多得多)有)。

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

答案 3 :(得分:1)

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

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

因此,将行更改为

stacksize = 64*1024; 

并检查消耗了多少内存。

答案 4 :(得分:0)

如果您希望降低开销,请考虑用户空间线程技术,如光纤,合作任务管理。

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

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

GNU Portable线程:

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

Boost C ++协同例程:

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

仅限Windows的光纤作为FYI:

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

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

答案 5 :(得分:-2)

可能是这个原因:

“(识别漏洞

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

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