c - 这个函数被认为是可重入的吗?

我有一个具有以下实现的函数:

void func (uint8 index, uint8 status)
{
  if (status == 1)
  {
    myArrayOfStructures[index].status = 1;
  }

  else if (status == 0)
  {
    myArrayOfStructures[index].status = 0;
  }

  else
  {
    /* Nothing */
  }
}

注意:myArrayOfStructures 是文件中的全局变量。

我认为这个函数是可重入的,只要它的参数传递是通过堆栈完成的,因为下面的分析:

在函数调用时,函数的 2 个参数被压入堆栈。 如果函数被另一个 OS 任务本身中断,则参数将被第二次压入堆栈。 因此函数的 2 个实例是“独立的”,因为每个实例在堆栈中都有自己的一组参数。

直到我使用某个编译器选项优化了这个文件的速度。

经过优化,我发现这些参数的传递是通过寄存器完成的(我知道编译器有权做这样的事情(寄存器分配))。但是这种优化使得这个函数不可重入。

所以,我的问题是

  • 上面的函数真的是可重入的吗?
  • 如果是(可重入),编译器如何进行优化以恢复其可重入状态?

请给我引用您的答案。

非常感谢。

最佳答案

无论编译器选择何种参数传递模式,您的函数都是可重入的。

虽然依赖全局状态来正确执行会破坏可重入性,但简单地访问全局状态并不一定会使您的函数不可重入。特别是,如果您从不读取全局变量(如函数中的情况),则您的代码是可重入的,因为它的执行不依赖于全局状态。

就通过寄存器传递参数而言,上下文切换也会保存所有寄存器的内容,因此无论参数传递模式如何,值都是中断安全的。

https://stackoverflow.com/questions/41440680/

相关文章:

sandbox - 转移 Mac App Store 应用程序

macos - 如何使用 xhyve 从主机中删除 Minikube 主机路径目录?

scala - 为什么 Scala 没有为每个 monad 定义返回/单元函数(与 Haskell

visual-studio - 如何在 Visual Studio 2015(对于 C++)中仅禁用

r - 矢量化 : plotting multiple contours with geom_pat

css - 由于非整数宽度,媒体查询运行异常

sql-server - 如何查找 SQL Server 2016 Db 是否设置为内存优化?

datetime - 如何在Lua中的给定日期时间添加天数

clojure - 为什么 Datomic 属性以驼峰命名

pointers - SGX - 受信任的网桥和受信任的代理有什么区别?