Вы создаете и уничтожаете множество тем?
Большинство реализаций pthread добавляют «защитную страницу» при выделении стека потоков. Это защищенная от доступа страница памяти, используемая для обнаружения переполнения стека. Я бы ожидал, что по крайней мере один вызов mprotect будет создаваться или прерываться каждый раз, чтобы (не) защитить защитную страницу. Если это так, есть несколько очевидных стратегий:
- Установите размер страницы защиты на ноль, используя
pthread_attr_setguardsize()
перед созданием темы.
- Используйте пул потоков (столько потоков, сколько говорят процессоры). После завершения потока с задачей верните его в пул, чтобы получить новую задачу, а не завершать ее и создавать новый поток.
Другим объяснением может быть то, что вы находитесь на платформе, где стек потока будет увеличен в случае обнаружения переполнения. Я не думаю, что это реализовано в Linux с GCC / Glibc, но в последнее время были сделаны некоторые предложения в этом направлении. Если вы используете много места в стеке во время обработки, вы можете явно увеличить начальный / минимальный размер стека, используя pthread_attr_setstacksize
.
Или это может быть что-то совсем другое!