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