Я разрабатываю многопоточное модульное приложение с использованием языка программирования C и NPTL 2.6. Для каждого плагина создается поток POSIX. Проблема состоит в том, что каждый поток имеет свою собственную область стека, поскольку размер стека по умолчанию зависит от выбора пользователя, это может привести к огромному потреблению памяти в некоторых случаях.NPTL Default Stack Size Проблема
Для того, чтобы предотвратить ненужное использование памяти я использовал что-то похожее на это, чтобы изменить размер стека перед созданием каждого потока:
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()
изменяется, но общее использование памяти приложения (от пса/верхнего выхода/ртара) не изменилось:
OLD: 10485760 , NEW: 65536 - MIN: 16384
Когда я использую ulimit -s MY_STACK_SIZE_LIMIT
перед запуском приложения, я достигаю ожидаемого результата.
Мои вопросы:
1) Есть ли какие-либо портативные (между UNIX варианты) способ изменить (по умолчанию) нить размер стека после запуска приложения (до создания нити, конечно)?
2-) Можно ли использовать ту же область стека для каждой нити?
3-) Возможно ли полностью отключить стопку для потоков без большой боли?
Глупый вопрос, но после того, как вы изменили размер стека с помощью 'pthread_attr_setstacksize()', используете ли вы 'attr', когда вы действительно создаете поток? Можем ли мы увидеть, как вы называете 'pthread_create()'? –
Конечно, я обновил свой пост. –