Какой сигнал может вызвать 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 Точная среда не указана, что делает решение еще сложнее.

Другие вопросы по тегам