我正在用C编程,在256Mb系统上在Linux中创build了很多Pthreads。 我通常有+ 200Mb免费。
当我用less量的线程运行程序时,它可以工作,但是一旦我创build了大约100个线程,就会产生错误,因为系统内存不足。 我做了几个testing,每个线程使用几乎2Mb。 线程的堆栈大小设置为16Kb。
我用来创build每个线程的代码:
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);
这是正常的还是我错过了什么? 谢谢。
不确定它会有帮助,但尝试调用RLIMIT_STACK
与RLIMIT_STACK
限制堆栈大小为16K之前创建您的第一个线程。
系统线程库的设计目的不是为了在内存非常有限的系统上支持大量的线程。 您需要使用专为此目的设计的线程库,或者更好地使用更少的线程。
是的,几乎所有的操作系统都会在这么多的线程上窒息死亡。 操作系统制造商(Linux或其他)已经非常重视这个问题,因为很少有系统具有这么多的CPU,所以你的代码在执行100个线程时的执行速度可能不会比8个执行速度快得多(或者你有)。
我认为你需要做的是某种线程池。 我也怀疑这个页面上ulimit的答案是有用的,如果你真的需要这么多的线程,但正如我所说,我不认为很多线程在大多数情况下得到你很多,如果你修复它在你的程序,而不是该系统,它会使它更便携。
为什么stacksize = (double) 16*1024;
? 它是整数。
尝试将其设置为32或64千字节,因为可能不允许16 * 1024; 在堆栈中也可以有TLS(即使你不使用TLS;库也可以,包括libc)。
所以,改行
stacksize = 64*1024;
并检查消耗了多少内存。
如果您想要更低的开销,请考虑用户空间线程技术,如光纤,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
请参阅维基百科链接了解更多示例实现。
可能是这个原因:
“(认识到泄漏
如果您创建了一个可联接的线程,但忘记加入它,则其资源或私有内存始终保留在进程空间中,并且永远不会被回收。 总是加入可连接的线程; 通过不加入他们,你会冒严重的内存泄漏。)“
在此阅读: http : //www.ibm.com/developerworks/library/l-memory-leaks/