在具有拆分堆栈的多线程应用程序上使用setrlimit()增加堆栈空间

时间:2012-11-27 03:53:50

标签: gcc dynamic stack stack-overflow setrlimit

我正在考虑开发自己的工作窃取调度程序,其中一个需要解决的问题是堆栈溢出的可能性。这种情况只发生在一个工人不断窃取其他人的任务的不常见的情况下,例如:

steal();
work();
steal();
work();
steal();
...

可以使用几种技术来避免这种模式,但是简单地增加堆栈空间可能是最佳选择,因为它允许其他优化。在单线程应用程序上,这可以通过调用setrlimit()完成,但是对多个线程没有影响(除非从主线程调用)。

此行为可能与跨多个线程具有固定大小的堆栈有关。但是对于拆分堆栈(在GCC 4.6.0+上实现),这种限制不再适用。

我的问题是,对setrlimit()的调用是否仅适用于分组堆栈,或者如果可以调用基础brk() / mmap() / sbrk(),则为负面情况并手动完成。

1 个答案:

答案 0 :(得分:0)

以一种hackish的方式,我想我可以使用pthread_attr_setstacksize()/pthread_create()/pthread_join()创建一个新线程并完成其中的所有工作,但这是线程创建/调度的不必要开销。