请查看以下示例代码。由于while(1),FuncA在对象生存期内永远运行。假设代码在相当长的时间(24小时)或更长时间内达到“CondB”。这意味着funcB中的“curr_status”在此期间不会改变。是否有可能优化可以启动并且在此之后永远不会检查“curr_status”的更新值?我应该在这里使用volatile?
void funcB(string curr_status){
static string prev_status = "123";
if(prev_status != curr_status){
//do sometthing
prev_status = curr_status;
}
}
void funcA(){
while(1){
if(condA)
funcB("123");
if(condB)
funcB("xyz");
}
}
答案 0 :(得分:4)
在此之后,优化是否可以启动并且永远不会检查“curr_status”的更新值?
没有。优化可能不会改变程序的可观察行为(RVO和调用可能被覆盖的operator new
除外)。您在此处不需要volatile
。
这称为as-if rule。
答案 1 :(得分:1)
不,编译器不知道参数是否或何时会改变,因此将始终读取它。
答案 2 :(得分:-1)
volatile
。在线程或进程之间共享内存或直接写入外设时可能会发生这种情况。
您正在一个线程中运行并写入普通RAM,因此不必担心编译器会优化您的检查。
顺便说一句,在进行多线程处理时,应该使用正确的锁定或原子,并且在访问外围存储器时,linux建议使用在汇编程序而不是{{1}中实现的readl
和writel
}