我正在开发使用C编程语言的多线程模块化应用程序和NPTL 2.6。对于每个插件,都会创建一个POSIX线程。问题是每个线程都有自己的堆栈区域,因为默认的堆栈大小取决于用户的选择,在某些情况下这可能会导致大量的内存消耗。NPTL默认堆栈大小问题
为了避免不必要的内存使用我用类似于这样创建每个线程之前改变堆栈大小:加入在pthread_create()部分:
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);
编辑我。
此没有工作的工作如我所料,通过pthread_attr_getstacksize()
报告的堆栈大小被改变,但应用(从PS /顶部/ PMAP输出)的总的内存使用情况没有改变:
OLD:10485760 ,NEW:65536 - MIN:16384
当我在启动应用程序之前使用ulimit -s MY_STACK_SIZE_LIMIT
时,我达到了预期的结果。
我的问题是:
1)是否有任何便携式(间UNIX变体)的方法来改变启动应用程序(当然创建线程)之前后(默认)线程堆栈大小?
2-)是否可以为每个线程使用相同的堆栈区域?
3-)是否有可能完全禁用堆栈的线程没有太大的痛苦?
愚蠢的问题,但是当你通过'pthread_attr_setstacksize()'修改了堆栈大小后,你是否在实际创建线程时使用了'attr'?我们可以看看你如何调用'pthread_create()'? – 2009-12-04 08:05:09
当然,我已更新我的帖子。 – 2009-12-04 08:30:11