2015-09-25 4 views
0

... и возобновляется, если поток пинается сигналом. Нет доступных дампов ядра или стека.gcc 4.7.1 Статическая локальная инициализация на C++ висит

Кто-нибудь когда-либо видел это поведение раньше и был в состоянии комментировать любые известные ошибки gcc/glibc?

Посмотрите один раз на RHEL 5.5 Westmere и один раз на RHEL 6.5 Sandybridge. В первый раз я сделал pstack, и он находился внутри локального статического инициализатора cxa_guard_acquire, который запускал pstack (= attach/detaching gdb), возобновил поток этого времени.

+0

@HelloWorld - статическая * локальная инициализация, происходит лениво при первом вызове функции – bobah

ответ

0

Это оказалось проявлением ошибки, зафиксированной this commit. Версия с ошибкой может (три потока, требуемые для минимального воспроизведения) отменить подписку на все потоки, ожидающие статической инициализации, чтобы завершить ее из «вызова пробуждения», поэтому поток, запускающий инициализацию, не разбудит других, когда это будет сделано.

FSM из cxa_guard_acquire имеет четыре возможного состояния:

  • неинициализированных
  • инициализации
  • инициализации + ожидания
  • инициализируется

Первого потока, который попадет локальные статические переменный переключает машина «инициализируется», последующие потоки ударяют ее перед инициализацией завершены, переключая его на «инициализацию + ожидание» и блокировку futex. По завершении инициализации инициализирующая нить пробуждает всех заблокированных на futex, если состояние было «инициализировано + ожидание» в конце инициализации. Ошибка может вызвать «инициализацию + ожидание возврата к« инициализации ».

Смежные вопросы