zoukankan      html  css  js  c++  java
  • Linux下可重入函数

    可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。
    可重入函数使用的变量有两种情况:
    1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;
    2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。
    void strcpy(*dest,*src)
    {
        while(* dest++ = *src ++){;}
        *dest = NUL;
    }
    
    分析:上面的函数用于字符串复制,而参数是存放在堆栈中的,故而改函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。
     
    基本上下面的函数都是不可重入的:
        1.函数内使用了静态的数据。
        2.函数内使用了malloc()或者free()函数的。
        3.函数内调用了标准的I/O函数的。
    int temp;
     void swap(int *ex1,int *ex2)
    {
        temp = *ex1; //(1)
        *ex1 = *ex2;
        *ex2 = temp;
    }
    
    分析:该函数中的全局变量temp是的函数变成了一个不可重入的函数,因为在多任务系统中,假如在任务1中调用swap函数,而程序执行到(1)处时被中断,进而执行其它的任务2,而刚好任务2也调用了swap函数,则temp里存的值则会被任务2改变。从而回到任务1被中断处继续执行的时候,temp里存的值已经不再是原来存的temp值了,进而产生了错误。
     
    常用的可重入函数的方法有:
    1.不要使用全局变量,防止别的代码覆盖这些变量的值。
    2.调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。
    3.使用信号量(互斥条件)。
    总之:要保证中断是安全的

      

      

  • 相关阅读:
    Redux其实很简单(原理篇)
    基于Docker的UI自动化初探
    视觉设计师的进化
    浅谈容器监控和网易云计算基础服务实践
    微服务实践沙龙-上海站
    知物由学 | 见招拆招,Android应用破解及防护秘籍
    6本互联网技术畅销书免费送(数据分析、深度学习、编程语言)!
    Lily-一个埋点管理工具
    ArcGIS 10 许可配置
    How to Programmatically Add/Delete Custom Options in Magento?
  • 原文地址:https://www.cnblogs.com/sinaxyz/p/2679440.html
Copyright © 2011-2022 走看看