Skip to content

可重入函数

C
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int sum(int array[], int len)
{
    static int sum = 0;//存在静态变量,使得函数不能重入

    for(int i = 0; i<len ; i++)
    	sum += array[i];
    return sum;
    
}

void task1(void)
{
    sum(a, 10);
}

void task2(void)
{
    sum(b, 20);
}

可重入函数

  • 可以多次重复调用
  • 可以被多个任务重复调用
  • 运行过程中可以被打断
  • 不影响运行结果

不能存在的因素

  • 函数内部使用全局或局部变量
  • 返回值是一个全局或局部变量
  • 内部使用了malloc()/free()
  • 函数内部使用了标准的I/O函数
  • 调用了其他不可重入的函数

实现的方法

  • 和上面相反

操作系统解决方法

在访问公共的资源的时候采取一定的安全措施,实施对资源的互斥访问,或者在访问时不允许被打断

具体方法:信号量、互斥量、锁等机制

临界资源:公共的资源,如全局变量、静态变量、缓冲区、打印机等

临界区:访问临界资源的代码段