1、可重入函数
可重入函数即表示可以被多个执行流重复进入,意味着只使用自己栈上的变量,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。
一个不可重入函数的例子:
int global;
int fun( int a )
{
int temp;
global = a;
temp = gloabl*2;
return temp;
}
global是一个全局变量,若进程a运行这段代码传入的参数是2,预期的结果是4;进程b也运行这段代码,传入的参数是3,由于操作系统的进程调度,进程a中的global就有可能被覆盖,结果不一定是预期结果。
要想保证函数是可重入函数,在函数体内不能访问全局变量,不使用静态局部变量,(静态变量和全局变量都存在静态区)坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,可以利用互斥信号量来保护全局变量。
2、线程安全
线程: 是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。一个进程中可以并行多个线程,每条线程并行执行不同的任务。
线程安全: 如果一段代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题是由全局变量及静态变量引起的。
3、重入函数与线程安全的区别和联系
联系:引发线程安全和可重入函数问题的原因是一样的,都是由于使用了全局变量及静态变量。
区别:可重入函数问题,是对于不同进程间来说的,而线程安全问题是针对同一个进程中的不同线程来说的。
时间: 2024-12-28 14:03:18