线程安全
线程安全:一个函数称为线程安全,当且仅当被多个并发线程反复调用时,它一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的。
以下我们定义4种,线程不安全的函数:
(第1类):不保护共享变量的函数,比如对一个全局变量多个线程操作,产生错误结果;
解决方法:利用像P,V操作这样的同步操作保护共享变量,优点:不用改代码,缺点:程序执行时间变慢。
(第2类):保持跨越多个调用的状态函数,简单说就是多个线程正在被调用的函数里调用了别的函数,例如rand函数;
这样没办法得重写。
(第3类):返回指向静态变量的指针的函数,不安全因为一个正在使用的结果会被另一个进程覆盖掉。
解决方法:可以使用加锁—拷贝技术:将线程不安全的函数与互斥锁联系起来。在每一个调用的位置对互斥锁加锁,调用线程不安全函数,将结果拷贝到私有存储位置,然后对互斥锁解锁,每个线程使用自己的私有拷贝。
(第4类:)调用线程不安全函数。
可重入性
可重入函数具有:当它们被多个多个线程调用不会引起任何共享数据
是一类重要的线程安全函数。
显示可重入:如果所有函数都是传值,且所有数据的引用都是本地的自动栈变量,那么这个函数无论被如何的调用它都是线程安全的。
隐式可重入:函数参数传的的是指针,如果调用的线程小心的传递的指向非共享数据的指针,那么它是线程安全的。
还有一点:可重入性有时既是调用者也是被调用者的属性,并不是只有被调用者单调具有的属性。