我读到了 C 的用法volatile
内存映射硬件寄存器、ISR 和多线程程序中的关键字。
1)注册
uint8_t volatile * pReg;
while (*pReg == 0) { // do sth } // pReg point to status register
2) ISR
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
不存在,因为变量更改是从hardware,编译器可能看不到变量的任何更改code.
但对于情况 2) 和 3),为什么需要 volatile?在这两种情况下都声明了变量global,编译器可以看到它在多个地方使用。那么为什么编译器要优化while
如果变量不是则循环volatile
?
是因为编译器在设计上不知道“异步调用”(在 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
变量中添加限定符以避免之前在多线程程序中进行优化?