线程安全函数
概念:
线程安全的概念比较直观。通常说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 线程安全指的是多线程并发执行时,可以获得正确的结果,这里强调的是并发性,确保线程安全的措施是:线程安全函数不使用共享数据(全局、静态或堆)或者对共享数据实施同步机制保护。
确保线程安全:
要确保函数线程安全,主要须要考虑的是线程之间的共享变量。属于同一进程的不一样线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。所以,对于同一进程的不一样线程来讲,每一个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访 问时,若是要保证线程安全,则必须经过加锁的方式。安全
可重入函数
概念:多线程
可重入函数主要用于多任务环境中,一个可重入的函数简单来讲就是能够被中断的函数,也就是说,能够在这个函数执行的任什么时候刻中断它,转入OS调度下去执行另一段代码,而返回控制时不会出现什么错误;而不可重入的函数因为使用了一些系统资源,好比全局变量区,中断向量表等,因此它若是被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。并发
确保可重入:
要确保函数可重入,需知足如下几个条件:
一、不在函数内部使用静态或全局数据
二、不返回静态或全局数据,全部数据都由函数的调用者提供。
三、使用本地数据,或者经过制做全局数据的本地拷贝来保护全局数据。
四、不调用不可重入函数。
ide
不可重入的后果:
不可重入的后果主要体如今象信号处理函数这样须要重入的状况中。若是信号处理函数中使用了不可重入的函数,则可能致使程序的错误甚至崩溃。函数
可重入函数与线程安全:spa
可重入与线程安全并不等同。通常说来,可重入的函数必定是线程安全的,但反过来不必定成立。线程
例如:orm
- 若是一个函数中用到了全局或静态变量,那么它不是线程安全的,也不是可重入的;
- 若是咱们对它加以改进,在访问全局或静态变量时使用互斥量或信号量等方式加锁,则能够使它变成线程安全的,但此时它仍然是不可重入的,由于一般加锁方式是针对不一样线程的访问,而对同一线程可能出现问题;
- 若是将函数中的全局或静态变量去掉,改为函数参数等其余形式,则有可能使函数变成既线程安全,又可重入。htm