线程安全和可重入函数

来源:互联网 发布:软件构架实践 epub 编辑:程序博客网 时间:2024/06/12 21:46

一、什么是线程安全?
1.线程安全就是指多线程访问同一代码,不会产生不确定的结果。也是就说线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,用锁对数据进行保护,其他线程不能访问该数据直到该线程读完,其他数据才可以使用,线程安全不会出现数据不一致或者数据污染。反之,线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得数据是脏数据。
2.有这么四类函称为线程不安全的:
(1)不保护共享变量的函数;
(2)函数状态随着调用改变的函数;
(3)返回指向静态变量指针的函数;
(4)调用线程不安全函数的函数;

二、什么是可重入函数?
主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

一个可重入函数需要满足的是:
(1)不使用全局变量或静态变量;
(2)不使用用malloc或者new开辟出来的空间;
(3)不调用不可重入函数;
(4)不返回静态或全局数据,所有函数都由函数的调用者提供;
(5)使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据;

三、线程安全与可重入函数区别与联系
1、线程安全是在多线程情况下引发的,而可重入函数可以在只有一个线程的情况下发生。
2、线程安全不一定是可重入的,而可重入函数则一定是线程安全的。
3、如果一个函数有全局变量,则这个函数既不是线程安全也不是可重入的。
4、如果一个函数当中的数据全是自身栈空间的,则这个函数既是线程安全也是可重入的。
5、如果将对临界资源的访问加锁,则这个函数是线程安全的;但如果重入函数的加锁还未释放,则会产生死锁,因此不能重入。
6、线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作不影响结果,使结果是相同的。