Какой сигнал может вызвать pthread_join()?
У меня было состояние ошибки в C++, которое я не могу легко воспроизвести в моем вызове pthread_join(), был сгенерирован какой-то сигнал, я не знаю, какой именно, но мой обработчик сигнала был вызван и по какой-то причине не распечатал обычную отладочную информацию на сигнал, который был сгенерирован. Я получил трассировку стека, которая показала:
# 2 /lib/tls/libpthread.so.0: pthread_join(...) +0x1c [0xce439c]
Я просмотрел справочную страницу для pthread_join() и не увидел упоминаний о сигналах.
Какой сигнал мог быть сгенерирован и что могло быть причиной? Это может быть какое-то состояние гонки.
1 ответ
http://linux.die.net/man/7/pthreads:
Signals are used in implementation internally
http://osr600doc.sco.com/man/html.PTHREAD/pthread_join.PTHREAD.html:
The wait in pthread_join is not broken by a signal.
If a thread waiting in pthread_join receives a signal that is not masked,
it will execute the signal handler, and then return to waiting in pthread_join.
Note that this behavior differs from that of pthread_cond_wait.
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fapis%2Fusers_25.htm:
Threadsafe: Yes
Signal Safe: No
По сути, вы можете столкнуться с тем фактом, что pthread_join() принимает какой-то другой сигнал из-за некоторой ошибки или внешнего события.
Мы не можем догадаться, что именно вызывает сигнал.
PS Точная среда не указана, что делает решение еще сложнее.