线程安全和可重入函数
线程安全:
一般来说,我们称一个函数为线程安全的,指但该函数被多个并发的线程反复调用时,它会一直产生正确的结果。我们成为这类函数为线程安全函数。反之,如果一个函数被多个并发线程反复调用,但不能保证最终结果的正确性的函数称为线程不安全函数。
重入:函数被不同的流调用,即上次调用还没有完成返回,下一个流已经进入函数开始的位置进行下次调用。
可重入:当程序被多个线程同时调用,但可以保证 返回结果的 正确性。
可重入函数:
可重入函数是线程安全函数的一种,即多线程调用不会引起任何共享数据。(函数只访问自己的局部变量和参数)
不可重入函数:
当函数进行访问一个全局变量或参数时,有可能因为多个线程的重入而造成返回结果的混乱,将该类函数称为不可重入函数。
如何将不可重入函数改成线程安全函数:
由于不可重入函数主要是需要访问全局变量等因素,我们可以通过加锁(PV操作等)来控制对共享资源的访问,可以达到线程安全。但是该类函数效率比可重入函数时间多用在同步上,增加了执行时间,即可重入函数较其他线程安全函数效率高。
线程安全和可重入函数的比较:
1)线程安全是在多线程下引发的,而可重入函数可在单线程条件下讨论。
2)线程安全函数不一定是可重入函数,但是可重入函数一定是线程安全函数。
3)如果一个函数引入了全局变量,那么该函数既不是线程安全函数也不是可重入函数。
4)如果对临界资源的访问加锁,我们认为该函数时线程安全函数,但会出现不释放锁等死锁情况,故该函数不是可重入函数。
5)线程安全函数要求多个线程可以访问同一块地址空间,而可重入函数要求多个执行流对数据的操作互不影响 使结果相同。