线程安全与可重入函数

xiaoxiao2021-02-28  126

一、线程安全

线程安全:线程安全是指多线程访问运行时,当一个线程访问数据时采用加锁机制,对访问的数据进行保护,其他进程访问该数据时,只能等待该进程访问结束后进行访问。这样就能保证数据不会出现数据错乱。

线程不安全多线程并行运行时,对线程访问不进行加锁,造成数据错乱,产生错误的结果。

线程安全问题产生原因:多线程程序对全局数据或静态数据进行访问修改;

确保线程安全:

要确保线程安全,首先要考虑到线程之间的共享数据。属于同一进程的不同线程只有自己独有的私有栈与寄存器,公共分享占有堆与全局区,因此对于一般进程中的线程之间,局部变量是私有的,而静态局部变量,全局变量,分配在堆上的数据时共有的,因此针对这些数据的操作需要进行加密。

二、可重入函数

可重入

可重入还没有一个详细的定义,基本上所有的文档只说明那些函数是可重入的,但没有具体定义可重入的概念。根据我的理解。可重入情况为,当程序在执行一个函数过程中,收到信号,则立即停止对该函数的执行,并且恰好程序收到的信号为执行该函数,这就完成了所谓的重入,如果该函数此时能正常的运行,并且在执行结束后,之前暂停的函数还能运行下去,则称为该函数是可重入函数。

可重入函数的条件:

1、不调用全局变量或静态局部变量;

2、不返回静态数据或全局数据,所有的数据都由函数的调用者提供;

3、不适用malloc或new开辟出的空间;

4、使用本地数据,或者通过制作全局变量的本地拷贝来保护全局变量。

可重入与线程安全

可重入与线程安全并不等同,可重入的一定线程安全,但是反过来则不一定成立。

总结:

1、如果一个函数使用了全局或静态变量,那么它一定是不可重入的、也是不安全的;

2、如果将函数中的全局变量与静态变量去掉,改成函数参数等其他形式,则有可能是线程安全同时可重入;

3、如果对临界资源加锁进行访问,则这个函数是安全的,但是这个重入函数没有释放则会出现死锁问题,因此是不可重入的;

4、可重入函数是要求不同的执行流对数据的操作互不影响,但线程安全则能使不同的线程安全地访问同一段地址空间。

转载请注明原文地址: https://www.6miu.com/read-50045.html

最新回复(0)