Lee*_*ton 5 c pthreads stack-size
我正在编写一些产生相当多线程的代码(目前约为512,但未来可能会更高).每个线程只执行少量操作,因此我希望线程在系统上的开销保持在最低限度.
我正在设置堆栈大小pthread_attr_setstacksize()
,我可以从中获得最小的允许堆栈大小PTHREAD_STACK_MIN
.但我的问题是:使用PTHREAD_STACK_MIN
线程堆栈大小是否安全?我如何计算我需要多少堆栈?是否有任何隐藏的开销需要添加到我的计算中?
此外,还有其他技术可以用来减少线程在系统上的负担吗?
你不应该在那么多线程附近创建任何东西,你绝对不应该创建一个新线程来执行少量操作.当且仅当您的现有线程完全饱和并且有更多可用的物理或逻辑关注才能工作时,您应该创建一个新线程.这对大约10个线程左右的合理当前应用程序施加了硬性限制,即使你在hexacore上运行,你最多只需要12个左右.这样的设计是非常有缺陷的,会使用大量的进程内存,并不会真正提高性能.
至于堆栈大小,你无法真正计算出任意线程需要多少,因为它完全取决于代码运行.但是,在Visual Studio中,典型的堆栈大小是几兆字节.您必须发布整个代码以及线程执行的反汇编,以了解要使用的堆栈大小.只需坚持几兆字节即可.
减少线程堆栈大小不会减少开销(不是在 CPU、内存使用或性能方面)。在这方面,您的唯一限制是为平台上的线程提供的总可用虚拟地址空间。
我会使用默认的堆栈大小,直到平台出现问题(如果确实发生)。如果出现问题,则尽量减少堆栈的使用。然而,这些将导致真正的性能问题,因为您需要使用堆,或者在其他地方设计依赖于线程的分配。
隐藏的管理费用可能包括:
alloca()
或者只是简单的静态大小的自动数组。boost::bind
可变参数模板、疯狂宏之类的东西,然后只是使用缓冲区或堆栈上的大对象的一般递归。除了设置堆栈大小之外,您还可以操作线程优先级,并根据需要暂停和恢复它们,这将极大地帮助调度程序和系统响应能力。Pthreads 允许您设置争用范围;LWP和范围内调度的性能特征差异很大。
以下是一些有用的链接:
归档时间: |
|
查看次数: |
4760 次 |
最近记录: |