可重入函数与线程安全

一.可重入函数

  1.定义:

  可重入函数:可以被两个或多个执行流进入的函数,并且产生的结果是正确的,可以在函数执行的任何时候中断它,它主要用于多任务环境中。
  不可重入函数:因为重入而导致错误的函数称为不可重入函数。

  2.不可重入函数:
  (1)函数内使用了静态数据结构;
  (2)函数内调用了malloc(),free();
  (3)函数内部调用了标准输入,标准输出;

  3.编写可重入函数的规则:
  (1)尽量使用局部变量,不要使用全局变量,如果必须访问全局变量时,要利用互斥信号量来保护全局变量;
  (2)和硬件发生交互时,要关闭硬件中断;
  (3)不调用任何不可重入的函数;
  (4)使用堆栈时要谨慎;

二.线程安全

 1.定义:线程安全即多线程访问时,采用加锁机制,在线程访问类中的数据时,进行了数据保护;

 2.如果一个函数能安全的同时被多个线程调用,并得到正确的结果,那么这个函数就是线程安全的;

 3.所有导致结果不正确的因素,都是不安全的调用;

 4.线程的安全问题一般是由全局变量和静态变量引起的;

 5.线程安全不要求调用的函数结果具有可再现性;

 6.如何避免线程不安全问题:
   若每个线程对全局变量、静态变量只有读操作,那么这个全局变量是线程安全的,如果同时对它执行写操作,必须要考虑线程同步,负责影响线程安全。

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

由可重入函数和线程安全的特点可以知道:

1.可重入函数一定是线程安全的,但线程安全不一定是可重入的;

2.可重入函数和线程安全都与全局变量有关;

3.当对临界资源的访问加锁保护时,函数时线程安全的,但对可重入函数加锁后没有释放锁时,会造成死锁,变为不可重入;

4.可重入函数强调不同执行流对数据的操作互不影响,而且结果相同,但是线程安全允许在调用该函数时,出现互相影响的情况,只要使用互斥锁保证安全性即可;

5.对于一个不可重入函数,可以通过互斥锁让它安全的被多个线程同时调用,那么这个不可重入函数转换成为了线程安全;

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值