...如果线程被信号踢了,则恢复。没有可用的核心转储或堆栈跟踪。
之前有没有人见过这种行为并且能够注释任何已知的gcc / glibc错误?
在RHEL 5.5 Westmere上看过一次,在RHEL 6.5 Sandybridge看过一次。我第一次做pstack并且它是在cxa_guard_acquire本地静态初始化生成的守护内部,运行pstack(=附加/分离gdb)恢复了该时间的线程。
答案 0 :(得分:0)
这似乎是由this commit修复的错误的表现。带有bug的版本(最小再现所需的三个线程)取消订阅等待静态初始化从“唤醒调用”完成的所有线程,因此触发初始化的线程在完成时不会唤醒其他线程。
cxa_guard_acquire的FSM有四种可能的状态:
命中本地静态变量的第一个线程将机器切换到"初始化",在初始化完成之前命中它的后续线程将其切换到"初始化+等待"并阻止futex。初始化完成后,如果状态是"初始化+等待"则初始化线程唤醒在futex上阻塞的每个人。在初始化结束时。错误可导致"初始化+等待重置为"初始化"。