首页 > 编程语言 >C++可重入函数和不可重入函数

C++可重入函数和不可重入函数

时间:2023-08-05 18:34:43浏览次数:45  
标签:重入 调用 函数 不可 C++ 全局变量 变量

转载:https://blog.csdn.net/weixin_41969690/article/details/108006834

C++可重入函数和不可重入函数

可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。
不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。

  • 由于使用了未受保护的系统资源,如全局变量区,中断向量表等。
  • 不可重入函数在实时系统设计中被视为不安全函数。

可重入函数特点:

  • 没有静态数据结构
  • 不返回指向静态数据的指针
  • 所有函数数据由函数的调用者提供
  • 使用auto变量,或通过全局变量的拷贝来保护全局变量
  • 若必须访问全局变量,则利用互斥信号保护
  • 不调用不可重入函数

不可重入函数特点:

  • 函数中使用了静态变量,无论是全局静态变量还是局部静态变量
  • 函数返回静态变量
  • 函数中调用了不可重入函数
  • 函数体内调用了malloc()或者free()函数
  • 函数体内调用了其他标准I/O函数
  • 函数是singleton中的成员函数,而且使用了不属于线程独立存储的成员变量

可重入规则改写不可重入函数:
把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它

可重入规则:

  • 1.不要使用全局变量。如果必须使用记得用互斥信号量保护,因为别的代码很可能修改这些变量值
  • 2.在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。
    完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/ OS_EXIT_KERNAL来描述。
  • 3.不能调用任何不可重入的函数。
  • 4.谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。

总之,必须保证中断是安全的

标签:重入,调用,函数,不可,C++,全局变量,变量
From: https://www.cnblogs.com/whiteBear/p/17204831.html

相关文章

  • 无涯教程-Perl - abs函数
    描述此函数返回其参数的绝对值。如果传递了纯整数值,则它将按原样返回它,但是如果传递了字符串,则它将返回零。如果省略VALUE,则使用$_语法以下是此函数的简单语法-absVALUEabs返回值此函数返回其参数的绝对值。例以下是显示其基本用法的示例代码-#!/usr/bin/perl......
  • 无涯教程-Perl - last 语句函数
    当在循环内遇到last语句时,循环立即终止,程序控制在循环后的下一条语句处恢复。您可以为LABEL提供最后一个语句,其中LABEL是循环的标签。last语句可以在嵌套循环内使用,如果未指定LABEL,则该语句将适用于最近的循环。last-语法last[LABEL];last-流程图last-示例#!/us......
  • 无涯教程-Perl - redo语句函数
    redo命令重新启动循环块,而无需再次判断条件。您可以提供带有redo语句的LABEL,其中LABEL是循环的标签。redo语句可以在嵌套循环中使用,如果未指定LABEL,则该语句将适用于最近的循环。redo-语法redo[LABEL]redo-流程图redo-示例以下程序显示了redo语句的用法-#/......
  • linux select函数详解
    转载:linuxselect函数详解-AlanTu-博客园(cnblogs.com)在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核:     •我们所关心的文件描述符     •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还......
  • 代码随想录-字符串-c++总结
    关于字符串string一些库函数的使用,不太熟悉,导致开始做的时候比较磕磕绊绊主要用到了<algorithm>中的reverse,以及string的resize,substr,erase等,在这贴一个C++字符串(string)常用操作总结-知乎(zhihu.com)C++的string库用法总结-知乎(zhihu.com)反转字符串||中,每2k个字符进......
  • C# 如何调用C++ dll string类型返回
    这篇文章主要介绍了C# 如何调用C++ dll string类型返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 −目录C#调用C++dllstring类型返回C++端:(定义返回数据为结构体Vector4)C#端:(接收返回的结构体Vector4)C#调用C++dll类型......
  • 无涯教程-Perl - do...while 语句函数
    与for和while循环不同,它在循环的顶部测试循环条件,而do...while循环在以下位置检查其条件:循环的底部。do...while循环与while循环相似,除了保证do...while循环至少执行一次。do...while-语法do{statement(s);}while(condition);应当注意,条件表达式出......
  • 深度剖析JAVA 函数式接口
    一、什么是函数式接口:函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。可以有多个非抽象方法。为了避免别人在这个接口中增加......
  • 无涯教程-Perl - 嵌套循环函数
    一个循环可以嵌套在另一个循环中,Perl允许嵌套所有要嵌套的循环。nestedloops-语法Perl中嵌套for循环语句的语法如下-for(init;condition;increment){for(init;condition;increment){statement(s);}statement(s);}Perl中嵌套while循环语......
  • C/C++ 数据结构五大核心算法之回溯法-N皇后问题
    N皇后问题:在n*n的棋盘上要摆n个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数n,返回n皇后的摆法数。#include<iostream>#include<math.h>#defineN8usingnamespacestd;intq[N+1];//q[i]表示第i个皇后在第i行上的第q[i]列intcheck(i......