Should ALL global variables be volatile-qualified?

后端 未结 5 1245
走了就别回头了
走了就别回头了 2020-12-31 09:48

In this example, does correctness require global_value to be declared volatile?

int global_value = 0;

void foo () {
    ++ global_v         


        
5条回答
  •  误落风尘
    2020-12-31 10:37

    Volatile isn't needed in this example. If, for instance, some_function() outputs something, the asm listing seems changes observable behaviour of the c++ machine and violates the standard.

    I guess it is a compiler bug Here is GCC assembler output:

    .cfi_def_cfa_register 5
    subl    $24, %esp
    .loc 1 67 0
    movl    global_value, %eax
    addl    $1, %eax
    movl    %eax, global_value
    movl    global_value, %eax
    movl    %eax, (%esp)
    call    _Z13some_functioni
    .loc 1 68 0
    call    _Z3foov
    .loc 1 69 0
    movl    global_value, %eax
    addl    $1, %eax
    movl    %eax, global_value
    movl    global_value, %eax
    movl    %eax, (%esp)
    call    _Z13some_functioni
    .loc 1 70 0
    leave
    .cfi_restore 5
    

    global_value is reloaded, as expected, between function calls

    Also volatiles are for thread-safety too, simply v-qualifier is not sufficient for thread safety in all cases (you sometimes need additional care about atomicity and memory barriers, but interthread communication variables should be volatile...

    [EDITED]: ... if they are repeatedly read and may be changed by another thread between reads. This, however, is not the case if any syncronization lock (mutex, etc) is used, since lock guarantees the variables can not be changed by any concurrent activity) (thanks to R..)

提交回复
热议问题