《可重入函数和不可重入函数》

1.可重入函数和不可重入函数的概念

可重入函数

定义:可重入函数是指可以在被调用的过程中被中断,并在中断处理程序中再次被调用的函数。执行过程中,函数的状态(如局部变量和参数)不会被后续的调用破坏。

特点:

  1. 无静态或全局变量:可重入函数不依赖或修改静态或全局变量。
  2. 只使用局部变量:所有状态信息都保存在局部变量或通过参数传递。
  3. 不调用不可重入函数:可重入函数不调用其他不可重入函数。
  4. 线程安全:可重入函数通常是线程安全的。

不可重入函数

定义:不可重入函数是指不能在被调用的过程中被中断,并在中断处理程序中再次被调用的函数。如果在函数执行过程中被中断,并且中断处理程序也调用同一个函数,可能会导致数据不一致或不可预测的结果。

特点:

  1. 使用静态或全局变量:函数依赖或修改静态或全局变量。
  2. 可能调用不可重入函数:函数可能调用其他不可重入函数。
  3. 不是线程安全的:不可重入函数在多线程环境中可能导致竞争条件。

总之:

可重入函数:可以被多个线程或中断安全的同时调用。

不可重入函数:一旦中途被打断再次调用,可能导致数据错乱或崩溃。

 

以下函数都是不可重入函数:

  1. 字符串处理函数:
    • strcpy
    • strcat
    • strstr
  2. 标准I/O函数:
    • printf:引用全局变量stdout,且许多实现以不可重入的方式使用全局数据结构。
    • scanf
    • fopenfclosefreadfwrite等文件操作函数
  3. 内存管理函数:
    • malloc:维护内部的链表,且引用全局的内存分配表,在中断上下文中调用可能导致问题。
    • free
  4. 时间处理函数:
    • asctime:返回的字符串存储在静态缓冲区中,所有线程共享同一个缓冲区。
    • ctime
    • localtime
  5. 随机数生成函数:
    • rand:通常使用静态变量来保存随机数生成器的状态。
  6. 其他函数:
    • toupper(C++标准库中的版本):在内部使用了静态变量。
    • strtok:使用静态变量来保存分割字符串的上下文。

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2021-07-25 11:44  一个不知道干嘛的小萌新  阅读(422)  评论(0)    收藏  举报