【发布时间】:2017-02-13 10:00:34
【问题描述】:
我有一个函数,它遍历函数指针数组并按顺序调用这些函数中的每一个。
如果函数指针数组的内容在这个过程中发生了变化,会发生什么?函数调用是否可以被认为是足够原子的,以确保不会发生任何意外,或者必须注意不要在例如压栈时更改函数指针?
下面的一些示例(伪)代码。 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 字节)?即使该假设是正确的(事实并非如此),许多架构的地址都超出了机器字的大小,旨在用于存储代码和数据。
标签: c function function-pointers