我正在编写一些产生大量线程的代码(目前大约为512,但将来可能会更高)。每个线程仅执行少量操作,因此我希望将线程在系统上放置的开销保持在最低水平。
我使用pthread_attr_setstacksize()
设置堆栈大小,并且可以从PTHREAD_STACK_MIN
获取最小允许堆栈大小。但是我的问题是:将PTHREAD_STACK_MIN
用于线程堆栈大小是否安全? 我该如何计算我需要多少堆栈?我需要在计算中添加任何隐藏的间接费用吗?
另外,还有其他我可以用来减轻线程对系统负担的技术吗?
最佳答案
减少线程堆栈大小不会减少开销(在CPU,内存使用或性能方面)。在这方面,您的唯一限制是为平台上的线程提供的总可用虚拟地址空间。
我会使用默认的堆栈大小,直到平台出现其他问题为止(如果它确实发生了)。然后在出现问题时尽量减少堆栈使用。但是,这些将导致实际的性能问题,因为您将需要增加堆,或在其他地方添加devise thread-dependent allocation。
隐藏的间接费用可能包括:
alloca()
或仅是静态大小的自动数组。 boost::bind
,可变参数模板,疯狂的宏,然后再使用缓冲区或堆栈上的大对象进行一般递归。 除了设置堆栈大小之外,您还可以根据需要操纵线程优先级,以及挂起和恢复它们,这将大大有助于调度程序和系统的响应。 Pthreads允许您设置争用范围; LWP和范围调度的性能特征差异很大。
以下是一些有用的链接:
关于c - 安全线程堆栈大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4154543/