В многопоточном встроенном программном обеспечении (написанном на C или С++) потоку должно быть предоставлено достаточно пространства стека, чтобы он мог завершить свои операции без переполнения. Правильная калибровка стека имеет решающее значение в некоторых встроенных средах реального времени, потому что (по крайней мере, в некоторых системах, с которыми я работал) операционная система НЕ обнаружит это для вас.
Обычно размер стека для нового потока (кроме основного потока) обозначается во время создания потока (т.е. в аргументе pthread_create() или тому подобное). Часто эти размеры стека жестко закодированы до значений, которые, как известно, хороши на момент написания или тестирования кода.
Однако будущие изменения кода часто нарушают предположения, на которых основывались жестко закодированные размеры стека, и один судьбоносный день, ваш поток входит в одну из более глубоких ветвей своего графика вызовов и переполняет стек - снижая всей системы или без развращения памяти.
Я лично видел эту проблему в том случае, когда код, выполняемый в потоке, объявляет экземпляры структуры в стеке. Когда структура добавляется для хранения дополнительных данных, размер стека раздувается соответственно, что потенциально может привести к переполнению стека. Я предполагаю, что это может быть огромной проблемой для установленных кодовых баз, где сразу невозможно сразу определить полные эффекты добавления полей в структуру (слишком много потоков/функций для поиска всех мест, где используется эта структура).
Поскольку обычный ответ на вопрос о размере стека - "они не переносимы", допустим, что компилятор, операционная система и процессор - все известные величины для этого исследования. Пусть также предполагается, что рекурсия не используется, поэтому мы не имеем дело с возможностью сценария "бесконечной рекурсии".
Каковы некоторые надежные способы оценки необходимого размера стека для потока? Я бы предпочел методы, которые находятся в автономном режиме (статический анализ) и автоматический, но все идеи приветствуются.