Гарантирует, что сигналы POSIX не будут доставлены в частично инициализированный поток ?

В большинстве реализаций потоков POSIX требуется некоторая инициализация во вновь созданном потоке, прежде чем он перейдет в согласованное состояние, способное запускать код приложения. Это может включать разблокировку блокировок в структуре потока, инициализацию «регистра потока» в реализациях, которые его используют, инициализацию локальных данных потока (либо TLS уровня компилятора, либо данные, специфичные для потока POSIX) и т. Д. Я могу ' t найти четкую гарантию того, что вся эта инициализация будет завершена до того, как поток сможет получить какие-либо сигналы; самое близкое, что я могу найти, - это 2.4.3:

В следующей таблице определяется набор функций, которые должны быть безопасными для асинхронных сигналов. Следовательно, приложения могут вызывать их без ограничений из функций перехвата сигналов:

...

Предположительно, некоторые из этих функций (по крайней мере, fork , который должен проверять глобальное состояние, установленное функция pthread_atfork ) зависит от того, что поток находится в согласованном, инициализированном состоянии.

Меня беспокоит то, что я прочитал большую часть исходного кода glibc / nptl и не могу найти никакой явной синхронизации чтобы предотвратить обработку сигнала вновь созданным потоком до его полной инициализации. Я ожидал, что поток, вызывающий pthread_create , заблокирует все сигналы перед вызовом clone , а новый поток разблокирует их после завершения инициализации, но я не могу найти никакого кода для этого эффекта, и я не вижу его в выводе strace .

10
задан R.. 19 November 2010 в 16:55
поделиться