Я занимаюсь разработкой многопоточного модульного приложения с использованием языка программирования 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-) Возможно ли полностью отключить стек для потоков без особой боли?