1. 可重入函数和不可重入函数的定义
可重入函数:可以被多个任务同时调用的函数,不会导致数据错误或内存泄漏等问题。
- 不可重入函数:在多个任务同时调用时可能会修改其他任务的数据,从而导致不可预测的结果。
2. 可重入函数的特点
使用局部变量或受保护的全局变量
- 不修改其他任务的数据
3. 不可重入函数的特点
使用未受保护的全局变量或静态变量
- 可以被多个任务同时访问和修改
4. 常见的不可重入函数
字符串处理函数:strcpy、strcat、strstr 等
- 标准库函数:fopen、fclose、fread、fwrite 等
5. 注意使用不可重入函数
避免多个任务同时调用
- 避免数据错误或内存泄漏等问题
这里举一个简单的例子来说明可重入函数和不可重入函数。
首先,我们定义一个可重入的函数 add
,它接受两个参数并返回它们的和:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
接下来,我们定义一个不可重入的函数 swap
,它接受两个参数并交换它们的值。这个函数是不可重入的,因为它使用了未受保护的全局变量:
#include <stdio.h>
int swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
return 0;
}
现在我们创建两个任务,任务 1 和任务 2,它们同时调用这两个函数:
#include <stdio.h>
#include <pthread.h>
int main() {
pthread_t thread1, thread2;
int result1, result2;
pthread_create(&thread1, NULL, (void *)add, NULL);
pthread_create(&thread2, NULL, (void *)swap, NULL);
pthread_join(thread1, &result1);
pthread_join(thread2, &result2);
printf("任务 1 的结果:%d\n", result1);
printf("任务 2 的结果:%d\n", result2);
return 0;
}
当程序运行时,任务 1 和任务 2 会同时执行。由于 add
函数是可重入的,所以两个任务可以同时调用 add
函数,不会相互影响。而 swap
函数是不可重入的,所以当任务 1 和任务 2 同时调用 swap
函数时,它们会互相修改对方传入的指针变量的值,导致不可预测的结果。
注意,这里只是为了说明可重入和不可重入函数的概念,实际应用中需要避免使用不可重入函数,以确保多任务环境下程序的正确性。