我有一个函数会遍历函数指针数组,并按顺序调用这些函数中的每个函数。在更改数组内容时通过位于数组中的指针调用函数
如果在此过程中更改函数指针数组的内容会发生什么?函数调用是否可以被认为是足够原子的,以确保没有任何意外事件发生,或者必须注意不要改变函数指针,例如在堆栈上进行推送?
下面的一些示例(伪)代码。 init()在启动时运行一次,并且callFunctions()定期运行,例如每秒一次。然后changeFunctions()出现并更改functionPtrArray []的内容。这可能发生在任何时间点,因为代码是在不同的进程中运行的,就像环境一样的操作系统。
void (*functionPtrArray[3]) (void);
void init(void)
{
functionPtrArray[0] = function1;
functionPtrArray[1] = function2;
functionPtrArray[2] = function3;
}
void callFunctions(void)
{
for (i = 0; i < 3; i++)
{
*functionPtrArray[i]();
}
}
void changeFunctions(void)
{
functionPtrArray[0] = newFunction1;
functionPtrArray[1] = newFunction2;
functionPtrArray[2] = newFunction3;
}
关键问题是,一旦执行f [0],f [1]和f [2]是否与f [0]来自同一集合,是否重要。否则,你的代码是好的(假设检索和存储函数指针是原子的,基本上意味着它们是本地CPU和总线字的大小,所以读/写周期在一个周期中获取/存储整个本地机器字)。 –
@PaulOgilvie什么让你认为任何给定的通用CPU可以在一个周期内读取一个字(x字节)?即使这种假设是真的 - 事实并非如此 - 大量架构已经将地址扩展到机器字大小以外,旨在用于存储代码和数据。 – Lundin