可重入函数和线程安全的区别与联系

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 )两者的联系与区别

       联系:引发线程安全和可重入函数问题的原因是一样的,都是由于使用了全局变量及静态变量。

       区别:可重入函数问题,是对于不同进程间来说的,而线程安全问题是针对同一个进程中的不同线程来说的。

       


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值