可重入与线程安全

来源:互联网 发布:沈阳seo外包公司 编辑:程序博客网 时间:2024/06/10 03:32

一、可重入函数满足两个条件:

       1. 函数是线程安全的

       2. 函数是可软中断的。即执行了软中断处理例程后,再回过头来继续执行函数,结果仍然正确。



二、可重入和线程安全函数特性

1. 如果一个函数中用到一个全局或静态变量,那么它不是线程安全的,也不是可重入的。

2. 如果加以改进,在访问全局或静态变量时使用互斥量或信号量等方式加锁,则使它变为线程安全的,但此时它仍然是不可重入的,因为通常加锁的方式针对不同线程的访问,而对于同一线程可能出现问题。

3. 如果将函数中全局或静态变量去掉,改成函数参数等其他方式,则有可能使函数变成即线程安全,又可重入。

4. 线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。

5. 要确保函数线程安全,主要需要考虑线程之间的共享的变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。

6. 线程不安全可能导致的后果是显而易见的---共享变量的值由于不同线程的访问,可能发生不可预料的变化,进而导致程序错误,甚至崩溃。


三、要确保函数的可重入,需要满足以下几个条件:

1. 不再函数内部使用静态或全局数据。

2. 不返回静态或全局数据,所有数据都由函数调用者提供。

3. 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。

4. 不调用不可重入函数

后果:不可重入的后果主要体现在象信号处理函数这样需要重入的情况中。如果信号处理函数中使用了不可重入的函数,则可能导致程序错误甚至崩溃。

  安全的信号处理函数: