Согласно POSIX, альтернативный стек сигналов, установленный с sigaltstack
, является для каждого потока, и не наследуется новыми потоками. Однако я считаю, что в некоторых версиях кода библиотеки pthread в Linux и / или в пользовательском пространстве (по крайней мере, в старых ядрах с LinuxThreads и, может быть, в некоторых версиях с NPTL?) Есть ошибка, при которой альтернативный стек наследуется, и, конечно, это приведет к сбою всякий раз, когда Вы используете альтернативный стек. Есть ли причина, по которой вам нужны альтернативные стеки? Обычно единственная цель состоит в том, чтобы обрабатывать переполнения стека полуградиционно (позволяя себе некоторое место в стеке, чтобы перехватить SIGSEGV
и сохранить все несохраненные данные перед выходом). Я бы просто отключил его.
Либо используйте pthread_sigmask
, чтобы заблокировать SIGPROF
во всех потоках, кроме основного. Обратите внимание, что во избежание неприятного состояния гонки здесь вам необходимо заблокировать его в главном потоке перед вызовом pthread_create
, чтобы новый поток начинался с блокировки, и разблокировать его после возврата pthread_create
.