线程安全与可重入函数
一、线程安全
线程安全是指在多线程环境中,对临界资源进行加锁保护,不会出现数据不一致或数据污染.简单点来说,就是在多线程环境下并发运行,总是能得到正确的结果.
一般而言,线程不安全的原因往往在于对临界资源的访问没有进行特别的加锁处理.
不同的线程只有其私有栈空间与其寄存器的数据是私有的,其余都是共享的!
因此临界资源是指,全局变量、静态变量、堆空间等.
如果我们能够确保互斥地访问临界资源,那么整个线程就会处于安全状态.
二、可重入函数
如果一个函数,在不同执行流下重复运行,总能得到正确的结果,则这个函数被称为可重入函数.
举个简单的例子,假如我正在对链表进行头插操作,如果此时突然收到信号,转而去执行信号处理函数,而恰好信号处理函数同时也需要对链表进行头插操作.
此时便有两个执行流,一个是主函数中的头插;另一个是信号处理函数中的头插.
当这两个执行流都执行完毕之后,极有可能此时链表中的数据发生了错误,那么这个头插函数则不是可重入的!
三、可重入与线程安全对比
可重入与线程有一定的类似性,但两者绝对不是等同的.
可重入的一定是线程安全的,而反过来则不一定.
比如:一个函数,它用到了全局变量,那么这个函数不是可重入,也不是线程安全的.
如果对其加以改进,对全局变量进行加锁,那么该函数是线程安全的,但不是可重入的.
如果再对其加以改进,将全局变量改为局部变量,则该函数是可重入的,也是线程安全的.