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



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

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

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

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

我的问题是,对setrlimit()的调用是否仅适用于拆分堆栈,或者在否定的情况下,是否可以调用底层brk()/mmap()/sbrk()并手动完成。

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

最新更新