[ 编辑 ]对于背景阅读,并且要清楚,这就是我所说的:volatile关键字简介
在查看嵌入式系统代码时,我看到的最常见错误之一是省略了线程/中断共享数据的volatile.但是我的问题是,volatile当通过访问函数或成员函数访问变量时,是否"安全"不使用?
一个简单的例子; 在以下代码中......
volatile bool flag = false ;
void ThreadA()
{
...
while (!flag)
{
// Wait
}
...
}
interrupt void InterruptB()
{
flag = true ;
}
Run Code Online (Sandbox Code Playgroud)
...变量flag必须是volatile,以确保ThreadA中的读取不被优化,但是如果通过函数读取标志,那么......
volatile bool flag = false ;
bool ReadFlag() { return flag }
void ThreadA()
{
...
while ( !ReadFlag() )
{
// Wait
}
...
}
Run Code Online (Sandbox Code Playgroud)
...... flag还需要挥发吗?我意识到它不易受到伤害,但我担心的是它何时被省略而且没有发现遗漏; 这会安全吗?
上面的例子是微不足道的; 在真实的情况下(以及我要求的原因),我有一个包装RTOS的类库,这样就有一个抽象类cTask来自任务对象.这样的"活动"对象通常具有访问数据的成员函数,而不是可以在对象的任务上下文中修改但可以从其他上下文访问; 这样的数据被声明为volatile是否至关重要?
我真的对这些数据的保证感兴趣,而不是实际编译器可能做的事情.我可能会测试一些编译器并发现它们从未通过访问器优化读取,但有一天会发现编译器或编译器设置使得这个假设不真实.我可以想象,例如,如果函数是内联的,那么这样的优化对于编译器来说是微不足道的,因为它与直接读取没有什么不同.