Можно ли настроить вызов pthread_create, чтобы он этого не делал?
pthread_create()
необходимо выделить место для стека потока, иначе поток не сможет работать - даже с функция пустого потока. Вот для чего mmap
вы видите. Невозможно обойтись без.
или, возможно, использовать brk или что-то еще для автоматического увеличения сегмента данных?
Если у вас есть время и умение написать свой собственную библиотеку потоков, тогда у вас есть go и дайте нам знать, что происходит. В противном случае, нет, детали того, как pthread_create()
резервирует пространство для стека нового потока, не конфигурируются ни в одной из известных мне реализаций.
И это не имеет значения, так как вызов mmap()
не является проблемой , Если системный вызов имеет неисправимый сбой, то это сбой ядра, и вы получаете ядро pani c, а не приложение cra sh. Обнаружение разрушения стека в GNU C происходит в пользовательском пространстве. Поэтому функции, к которым он применяется, не отображаются в выходных данных strace, которые отслеживают только системные вызовы .
. Возможно, вам будет полезно лучше разбить стек и защитить GNU от Это. Доктор Добб опубликовал хорошую статью о том, что несколько лет go, и это все еще стоит прочитать. Суть в том, что разрушение стека происходит, когда реализация функции ведет себя неправильно, перезаписывая ту часть своего стекового фрейма, которая содержит адрес возврата. Если у вас нет встроенной сборки, разрушение почти наверняка происходит из-за того, что одна из ваших собственных функций выходит за пределы одной из ее локальных переменных. Он обнаруживается, когда эта функция пытается вернуться, используя инструментальный эпилог функции, который служит этой цели.