В большинстве реализаций потоков POSIX требуется некоторая инициализация во вновь созданном потоке, прежде чем он будет в согласованном состоянии, способном выполнять код приложения. Это может включать разблокировку блокировок в структуре потока, инициализацию «регистра потока» в реализациях, в которых он используется, инициализацию локальных данных потока (либо TLS-уровня уровня данных, либо данных, специфичных для потока POSIX), и т. Д. гарантировать, что вся эта инициализация будет завершена до того, как поток сможет получить какие-либо сигналы; самое близкое, что я могу найти, это 2.4.3:
В следующей таблице определен набор функций, которые должны быть безопасны для асинхронных сигналов. Следовательно, приложения могут вызывать их без ограничений из функций сбора сигналов:
...
Предположительно, некоторые из этих функций (по крайней мере fork
, которые должны проверять глобальное состояние, установленное функцией pthread_atfork
) зависят от того, находится ли поток в согласованном, инициализированном состоянии.
Одна вещь, которая беспокоит меня, это то, что я прочитал большую часть источника glibc / nptl и не могу найти никакой явной синхронизации, чтобы предотвратить обработку сигнала вновь созданным потоком до его полной инициализации. Я ожидаю, что поток, вызывающий pthread_create
, заблокирует все сигналы перед вызовом clone
, и новый поток разблокирует их после завершения инициализации, но я не могу найти никакого кода на этот счет и не вижу его в strace
вывод.