我应该使用volatile c ++吗?

时间:2017-02-02 00:08:21

标签: c++ volatile

请查看以下示例代码。由于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");
    }
}

3 个答案:

答案 0 :(得分:4)

  

在此之后,优化是否可以启动并且永远不会检查“curr_status”的更新值?

没有。优化可能不会改变程序的可观察行为(RVO和调用可能被覆盖的operator new除外)。您在此处不需要volatile

这称为as-if rule

答案 1 :(得分:1)

不,编译器不知道参数是否或何时会改变,因此将始终读取它。

答案 2 :(得分:-1)

对于可能由正在运行的线程范围之外的actor更改的内存,需要

volatile。在线程或进程之间共享内存或直接写入外设时可能会发生这种情况。

您正在一个线程中运行并写入普通RAM,因此不必担心编译器会优化您的检查。

顺便说一句,在进行多线程处理时,应该使用正确的锁定或原子,并且在访问外围存储器时,linux建议使用在汇编程序而不是{{1}中实现的readlwritel }