首页 > 代码库 > Reentrant Function/Thread-Safe/Async-Signal-Safe Function

Reentrant Function/Thread-Safe/Async-Signal-Safe Function

1.Reentrant Function:可重入函数

当捕捉到信号时,不论进程的主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数

返回后再继续执行主控制流程。信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。

技术分享

使用小结:

  • 不使用全局变量:上图使用了全局变量head导致出错
  • 不调用non-reentrant函数:malloc、标准IO函数

2.Thread-Safe:线程安全

使用小结:

  • 使用锁保障线程安全

3.Async-Signal-Safe Function:异步信号安全函数

使用小结:

  • signal_handle里面只有几个固定的函数是 signal-safe的(malloc、sprintf等都不是信号安全函数)
  • signal_handler里面使用锁很容易死锁:程序的某个线程获得了锁,然后然后还没释放,这时又被信号中断了,然后在signal handler函数里面又尝试去获取锁的话,就会重新获取锁,就死锁了。

参考:

http://idning.github.io/twemproxy-deadlock-on-signal_handler.html

http://wangcong.org/blog/archives/506

http://gmd20.blog.163.com/blog/static/168439232014516113322378/

Reentrant Function/Thread-Safe/Async-Signal-Safe Function