Hi Michael, On Tue, Nov 22, 2016 at 1:22 PM, Michael Niedermayer <mich...@niedermayer.cc> wrote: > > ok, i see th race but do you really need the atomic operations ? > isnt merging the 2 variables into 1 as you do enough ? > (i mean the tools might still complain but would there be an actual > race remaining?)
The atomic operations avoid the "undefined behavior" resulting from the data races in the C source code. ThreadSanitizer analyzes the C source code, therefore it must warn about what may be undefined behavior according to the C standard, even though for a particular compiler and processor, the generated code is the same. Here is a small test program that shows gcc generates the same x86_64 assembly code for the normal and atomic (with relaxed memory ordering) load and store operations: ========== $ gcc --version gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ cat flags.c static int flags; int get_flags_nonatomic(void) { return flags; } int get_flags_atomic_relaxed(void) { return __atomic_load_n(&flags, __ATOMIC_RELAXED); } void set_flags_nonatomic(int val) { flags = val; } void set_flags_atomic_relaxed(int val) { __atomic_store_n(&flags, val, __ATOMIC_RELAXED); } $ gcc -Wall -O3 -std=c11 -S -c flags.c $ cat flags.s .file "flags.c" .text .p2align 4,,15 .globl get_flags_nonatomic .type get_flags_nonatomic, @function get_flags_nonatomic: .LFB0: .cfi_startproc movl flags(%rip), %eax ret .cfi_endproc .LFE0: .size get_flags_nonatomic, .-get_flags_nonatomic .p2align 4,,15 .globl get_flags_atomic_relaxed .type get_flags_atomic_relaxed, @function get_flags_atomic_relaxed: .LFB1: .cfi_startproc movl flags(%rip), %eax ret .cfi_endproc .LFE1: .size get_flags_atomic_relaxed, .-get_flags_atomic_relaxed .p2align 4,,15 .globl set_flags_nonatomic .type set_flags_nonatomic, @function set_flags_nonatomic: .LFB2: .cfi_startproc movl %edi, flags(%rip) ret .cfi_endproc .LFE2: .size set_flags_nonatomic, .-set_flags_nonatomic .p2align 4,,15 .globl set_flags_atomic_relaxed .type set_flags_atomic_relaxed, @function set_flags_atomic_relaxed: .LFB3: .cfi_startproc movl %edi, flags(%rip) ret .cfi_endproc .LFE3: .size set_flags_atomic_relaxed, .-set_flags_atomic_relaxed .local flags .comm flags,4,16 .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4" .section .note.GNU-stack,"",@progbits ========== Wan-Teh Chang _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel