线程安全(Thread-Safe):如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。
线程不安全:当多个线程并发的调用一个函数。如果对全局数据或者静态数据在不加任何锁以及安全性的处理情况下,就会对多次修改数据的错误。比如我正在愿意个线程里处理一个全局变量的-1;正减完。结果还没有返回,就被另一个线程切出去了,而那个线程全局变量还是处于没有被处理的-1的值;本身我想让那个全局变量执行两次-1;结果执行了一次。这就是线程不安全。
线程安全函数的作用:解决多个线程调用函数时访问共享资源的冲突问题。
确保线程安全:要确保函数线程安全,主要需要考虑的是线程之间的共享变量。
属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访 问时,如果要保证线程安全,则必须通过加锁的方式。
可重入(Reentrant):是线程安全的一中。它是线程安全函数的一个真子集,当它们被多个线程调用时,不会引用任何共享数据,也就是不引用静态或全局变量。
1、不在函数内部使用静态或全局数据
2、不返回静态或全局数据,所有数据都由函数的调用者提供。
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、如果必须访问全局变量,利用互斥机制来保护全局变量。
5、不调用不可重入函数。
线程安全和可重入函数的关系:
1、一个函数对于多个线程是可重入的,则这个函数是线程安全的。
2、一个函数是线程安全的,但并不一定是可重入的。
3、可重入性要强于线程安全性。