可重入函数与线程安全

线程安全函数 
概念: 
       线程安全的概念比较直观。通常说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 线程安全指的是多线程并发执行时,可以获得正确的结果,这里强调的是并发性,确保线程安全的措施是:线程安全函数不使用共享数据(全局、静态或堆)或者对共享数据实施同步机制保护。
确保线程安全: 
       要确保函数线程安全,主要须要考虑的是线程之间的共享变量。属于同一进程的不一样线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。所以,对于同一进程的不一样线程来讲,每一个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访 问时,若是要保证线程安全,则必须经过加锁的方式。安全


可重入函数 
概念:
多线程

可重入函数主要用于多任务环境中,一个可重入的函数简单来讲就是能够被中断的函数,也就是说,能够在这个函数执行的任什么时候刻中断它,转入OS调度下去执行另一段代码,而返回控制时不会出现什么错误;而不可重入的函数因为使用了一些系统资源,好比全局变量区,中断向量表等,因此它若是被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。并发

确保可重入: 
       要确保函数可重入,需知足如下几个条件: 
       一、不在函数内部使用静态或全局数据 
       二、不返回静态或全局数据,全部数据都由函数的调用者提供。 
       三、使用本地数据,或者经过制做全局数据的本地拷贝来保护全局数据。 
       四、不调用不可重入函数。 

ide

不可重入的后果: 
       不可重入的后果主要体如今象信号处理函数这样须要重入的状况中。若是信号处理函数中使用了不可重入的函数,则可能致使程序的错误甚至崩溃。
函数


可重入函数与线程安全:spa

可重入与线程安全并不等同。通常说来,可重入的函数必定是线程安全的,但反过来不必定成立。线程

  例如:orm

      - 若是一个函数中用到了全局或静态变量,那么它不是线程安全的,也不是可重入的; 
     - 若是咱们对它加以改进,在访问全局或静态变量时使用互斥量或信号量等方式加锁,则能够使它变成线程安全的,但此时它仍然是不可重入的,由于一般加锁方式是针对不一样线程的访问,而对同一线程可能出现问题;
      - 若是将函数中的全局或静态变量去掉,改为函数参数等其余形式,则有可能使函数变成既线程安全,又可重入。
htm

相关文章
相关标签/搜索