我正在使用 C 编程语言和NPTL 2.6开发一个多线程模块化应用程序。对于每个插件,都会创建一个 POSIX 线程。问题是每个线程都有自己的堆栈区域,因为默认堆栈大小取决于用户的选择,这在某些情况下可能会导致巨大的内存消耗。
为了防止不必要的内存使用,我在创建每个线程之前使用了类似的东西来更改堆栈大小:
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_getstacksize(&attr, &st1);
if(pthread_attr_setstacksize (&attr, MODULE_THREAD_SIZE) != 0) perror("Stack ERR");
pthread_attr_getstacksize(&attr, &st2);
printf("OLD:%d, NEW:%d - MIN: %d\n", st1, st2, PTHREAD_STACK_MIN);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* "this" is static data structure that stores plugin related data */
pthread_create(&this->runner, &attr, (void *)(void *)this->run, NULL);
编辑 I:添加了 pthread_create() 部分。
这没有像我预期的那样工作,报告的堆栈大小发生了pthread_attr_getstacksize()
变化,但应用程序的总内存使用量(来自 ps/top/pmap 输出)没有改变:
旧:10485760,新:65536 - 最小:16384
当我ulimit -s MY_STACK_SIZE_LIMIT
在开始应用程序之前使用时,我达到了预期的结果。
我的问题是:
1-) 启动应用程序后(当然在创建线程之前)是否有任何可移植的(在 UNIX 变体之间)更改(默认)线程堆栈大小的方法?
2-) 是否可以为每个线程使用相同的堆栈区域?
3-) 是否有可能完全禁用线程堆栈而不会有太多痛苦?