可重入函数与线程安全

可重入函数

可重入函数主要用于多任务环境中,可重入函数简单来说就是可以在执行的任何时刻被中断的函数,转入OS调度下去执行另一段代码,在返回控制是不会出错,而不可重入函数由于使用了一些系统资源(全局变量,中断向量表),如果被中断的话就会出现问题。这种函数是不能运行于多任务环境中的。

也可以理解为可重入,重入可以重复进入,意味这可以被中断,除了使用自己栈上的变量,不依赖于其他环境。这样的函数允许有多个副本在运行,因为他们使用的是独立的栈,所有互补影响。

编写可重入函数需要使用全局变量,则应通过关中断你,信号量等手段对其加以保护。

 

可重入函数特点:
    由于可重入函数多次调用不会出错,因此可重入函数不会担心数据被破坏,可重入函数任何时刻都可以被中断,一段时间后又可以运行,相应的数据不会丢失,可重入函数只是用局部变量,及保存在CPU寄存器或堆栈中,使用全局变量时需要进行保护。

 

符合以下条件的都是不可重入函数:

1.调用了malloc/free函数,malloc函数是用全局链表来管理堆的。

2.调用了I/O函数库,许多I/O函数都是使用不可重入的方式来是用全局数据结构的。、

3.可重入函数体内使用了静态的数据结构。

4.调用了不可重入函数

线程安全

  一个函数称为线程安全的,而且仅当被多个并发进程调用时。它会一直产生正确的结果。

 

确保线程安全: 
       要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。

 

线程不安全的后果: 
       线程不安全可能导致的后果是显而易见的——共享变量的值由于不同线程的访问,可能发生不可预料的变化,进而导致程序的错误,甚至崩溃。

 

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

1.线程安全是在多个线程情况下引发的,而可重入函数可以在一个线程的情况下来说;

2.线程安全不一定是可重入的,而可重入函数一定是线程安全的。

3.如果一个函数中有全局变量,这个函数既不是线程安全也不是可重入的。

4.如果对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁未被释放则会产出死锁,因此是不可重入的。

5.线程安全函数可以使用不同的线程访问同一片地址空间,而重入函数要求不同的执行流对数据的操作产生相同的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值