gpt4 book ai didi

在更改数组内容时通过位于数组中的指针调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 05:34:49 25 4
gpt4 key购买 nike

我有一个函数,它遍历函数指针数组并按顺序调用这些函数中的每一个。

如果在此过程中函数指针数组的内容发生变化,会发生什么情况?是否可以将函数调用视为足够原子以确保不会发生意外情况,或者必须注意不要更改函数指针,例如在堆栈上进行推送时?

下面的一些示例(伪)代码。 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;
}

最佳答案

编辑:我太长了,被Lundin抢先了:https://stackoverflow.com/a/42201493/5592711

重要的一点:在 C 中调用函数归结为跳转,因此当程序执行该函数时,更改用于进行函数调用的假想指针不会改变任何内容程序流,因为指令指针已经在函数内。

例如,在此代码段中,some_function() 将执行正常并且不受 ptr 修改的影响。

void(*ptr)(void) = &some_function;
(*ptr)();
// ... in another thread, while 'some_function()' is executing
ptr = &other_function;

但是,你在这里提出了一个重点,因为内存操作不是原子的,一些线程可以修改 functionPtrArray[0] 元素,而另一个线程正在读取它,这将导致它跳转到一些垃圾地址,将导致您的程序失败,就像在这个假设的例子中一样。

为了确保线程之间的同步,您可以使用mutexes,例如使用pthread库(您可以自己谷歌一下,您会找到很多信息)。

在您的示例中,使用此类同步可能如下所示:

// You can use static mutex initialization
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void callFunctions( void )
{
pthread_mutex_lock(&mutex);
for ( i = 0; i < 3; i++ )
{
*functionPtrArray[i]();
}
pthread_mutex_unlock(&mutex);
}

void changeFunctions( void )
{
pthread_mutex_lock(&mutex);
functionPtrArray[0] = newFunction1;
functionPtrArray[1] = newFunction2;
functionPtrArray[2] = newFunction3;
pthread_mutex_unlock(&mutex);
}

这样,修改函数指针数组和执行函数是互斥的任务。你应该知道这个例子有几个限制:

  1. 互斥量在整个函数执行过程中被锁定(不需要,你可以锁定它以读取函数指针,解锁然后执行它们)
  2. 函数必须自己调用changeFunctions,否则您将陷入僵局。

关于在更改数组内容时通过位于数组中的指针调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com