我在记忆映射硬件寄存器、ISR和多线程程序中读到了C volatile
关键字的使用情况.
1) 登记
uint8_t volatile * pReg;
while (*pReg == 0) { // do sth } // pReg point to status register
(2) 科学研究院
int volatile flag = 0;
int main()
{
while(!flag) { // do sth }
}
interrupt void rx_isr(void)
{
//change flag
}
3)多线程
int volatile var = 0;
int task1()
{
while (var == 0) { // do sth }
}
int task2()
{
var++;
}
我可以看到为什么编译器可以错误地优化while
在情况1中)如果volatile
不在那里,’因为变量是从硬件进行的,编译器可能看不到从代码进行的变量的任何更改.
但对于案例2和3),为什么需要挥发性?在这两种情况下,变量都被声明为全局,编译器可以看到它在不止一个地方使用.那么如果变量不是volatile
,为什么编译器会优化while
循环?
是因为编译器副设计不知道“异步调用”(在ISR的情况下)或多线程?但这不能,对吗?
此外,案例3)看起来像多线程中的常见程序,没有volatile
关键字.假设我将一些锁定添加到全局变量(没有volatile
关键字):
int var = 0;
int task1()
{
lock(); // some mutex
while (var == 0) { do sth }
release()
}
int task2()
{
lock();
var++;
release();
}
对我来说它看起来足够正常.那么我真的需要volatile
在多线程中吗?如何从未见过volatile
限定符添加到变量以避免在多线程程序中优化?