gpt4 book ai didi

c - 互斥锁操作函数参数应该为 `volatile`吗?

转载 作者:行者123 更新时间:2023-12-03 12:54:41 25 4
gpt4 key购买 nike

我正在使用具有一些自制线程和同步功能的自定义嵌入式实时操作系统。互斥以类似于以下概述的方式实现:

typedef int Mutex;
#define MUTEX_ACQUIRED 1
#define MUTEX_RELEASED 0

bool AquireMutex(Mutex* pMutex)
{
bool Ret;
// Assume atomic section here (implementation specific)
if( *pMutex == MUTEX_RELEASED )
{
*pMutex = MUTEX_ACQUIRED;
Ret = true;
}
else
{
Ret = false;
}
// Atomic section end
return Ret;
}

void ReleaseMutex(Mutex* pMutex)
{
// Assume atomic section here (implementation specific)
*pMutex = MUTEX_RELEASED;
// end atomic section
}

假设上面的两个函数是原子的(在实际的实现中是原子的,但实际的实现与该问题无关)。

每个线程都共享一些全局定义的 m并具有类似于以下内容的代码:
extern Mutex m;
// .............
while (!AquireMutex(&m)) ;
// Do stuff
ReleaseMutex(&m);

问题是关于这一行的:
while (!AquireMutex(&m)) ;

实际每次迭代都会评估 AquireMutex吗?还是因为看不到 m的变化,优化器将其视为一个常数?
应该使用 AquireMutex限定词来声明 volatile:
bool AquireMutex(volatile Mutex* pMutex);

最佳答案

答案取决于带有while循环的调用站点是否可以看到这些功能的实现。如果不是(调用站点仅看到声明,定义在单独的源文件中),则volatile关键字将保持不变。 Optimizer完全不知道此函数对参数的作用,是否具有副作用等,因此将进行每个函数调用。

另一方面,如果释放和获取互斥锁的函数是内联的-则在调用站点上可以看到完整的实现的完整实现-那么优化器的确可以“微调”一些东西。问题在于“完整”一词-即使您发布的代码是内联的,但开始和结束关键部分的代码却可能不是。即使是这样,它也可能会使用优化器无法理解的汇编语句。即使它是纯C语言,它也可能访问一些 volatile 的内存映射寄存器。任何这样的代码段(调用外部函数,汇编语句,访问 volatile 内存)均有效地阻止了优化程序消除所有调用,因为在这种情况下,它必须假定每个调用都有副作用。

关于c - 互斥锁操作函数参数应该为 `volatile`吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42491995/

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