1

我在 C++ 中遇到了一个错误情况,我无法在调用 pthread_join() 时轻松重现一些信号,我不知道是哪一个,但是我的信号处理程序被调用了,并且由于某种原因没有打印出正常的调试信息在产生的信号上。我确实得到了一个堆栈跟踪,显示:

# 2 /lib/tls/libpthread.so.0: pthread_join(...) +0x1c [0xce439c]

我查看了 pthread_join() 的手册页,没有看到任何关于信号的提及。

产生的信号可能是什么,原因可能是什么?这可能是某种竞争条件。

4

1 回答 1

2

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 没有指定确切的环境,这使得决策更加困难。

于 2012-04-30T07:59:20.610 回答