《可重入函数和不可重入函数》
1.可重入函数和不可重入函数的概念
可重入函数
定义:可重入函数是指可以在被调用的过程中被中断,并在中断处理程序中再次被调用的函数。执行过程中,函数的状态(如局部变量和参数)不会被后续的调用破坏。
特点:
- 无静态或全局变量:可重入函数不依赖或修改静态或全局变量。
- 只使用局部变量:所有状态信息都保存在局部变量或通过参数传递。
- 不调用不可重入函数:可重入函数不调用其他不可重入函数。
- 线程安全:可重入函数通常是线程安全的。
不可重入函数
定义:不可重入函数是指不能在被调用的过程中被中断,并在中断处理程序中再次被调用的函数。如果在函数执行过程中被中断,并且中断处理程序也调用同一个函数,可能会导致数据不一致或不可预测的结果。
特点:
- 使用静态或全局变量:函数依赖或修改静态或全局变量。
- 可能调用不可重入函数:函数可能调用其他不可重入函数。
- 不是线程安全的:不可重入函数在多线程环境中可能导致竞争条件。
总之:
可重入函数:可以被多个线程或中断安全的同时调用。
不可重入函数:一旦中途被打断再次调用,可能导致数据错乱或崩溃。
以下函数都是不可重入函数:
- 字符串处理函数:
strcpystrcatstrstr
- 标准I/O函数:
printf:引用全局变量stdout,且许多实现以不可重入的方式使用全局数据结构。scanffopen、fclose、fread、fwrite等文件操作函数
- 内存管理函数:
malloc:维护内部的链表,且引用全局的内存分配表,在中断上下文中调用可能导致问题。free
- 时间处理函数:
asctime:返回的字符串存储在静态缓冲区中,所有线程共享同一个缓冲区。ctimelocaltime
- 随机数生成函数:
rand:通常使用静态变量来保存随机数生成器的状态。
- 其他函数:
toupper(C++标准库中的版本):在内部使用了静态变量。strtok:使用静态变量来保存分割字符串的上下文。
浙公网安备 33010602011771号