我正在開發使用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