当前位置: 技术问答>linux和unix
信号处理函数里面用CRT函数可能导致"信号触发-处理"死循环吗?
来源: 互联网 发布时间:2016-11-05
本文导语: 例如,在信号处理函数里面使用printf和malloc,会不会有什么风险? 这是个面试题,谢谢。 | malloc内部其实是有一个锁的,所以多线程程序使用malloc是没有关系的,因为就算是A线程正在malloc还...
例如,在信号处理函数里面使用printf和malloc,会不会有什么风险?
这是个面试题,谢谢。
这是个面试题,谢谢。
|
malloc内部其实是有一个锁的,所以多线程程序使用malloc是没有关系的,因为就算是A线程正在malloc还没有完切换到B线程,B也想malloc,但因为锁不上,所以会挂起切换回A, 等A线程malloc完释放锁B线程的malloc就可以继续了。
而对于信号处理,如果进程当前正在malloc的锁上还没有释放锁的时候来了一个信号,而信号处理里又去malloc想去锁,那就造成了死锁。
所以, 深入理解什么是线程安全,什么是信号安全。
另外,信号处理里的处理应该是尽可能的简单的。当你的信号处理里需要malloc之类的时候,一般来说是你的程序设计有问题。
而对于信号处理,如果进程当前正在malloc的锁上还没有释放锁的时候来了一个信号,而信号处理里又去malloc想去锁,那就造成了死锁。
所以, 深入理解什么是线程安全,什么是信号安全。
另外,信号处理里的处理应该是尽可能的简单的。当你的信号处理里需要malloc之类的时候,一般来说是你的程序设计有问题。
|
风险是有的
假定在主函数中正处于malloc()的中间阶段,维护内部链表 .. 此时进入信号处理函数,再次malloc(),
可能导致这个内部链表状态紊乱
假定在主函数中正处于malloc()的中间阶段,维护内部链表 .. 此时进入信号处理函数,再次malloc(),
可能导致这个内部链表状态紊乱
|
很显然不是这个原因。如果是这个原因,那malloc就不可以在多线程程序里调用了。