Sie sind besser dran mit der API von C11 <stdatomic.h>
zur Verfügung gestellt. Die __atomic
Builtins sind nur wie GCC sie unter der Haube implementiert, die Verwendung von Standard-API macht Ihren Code tragbarer.
gcc6 auf AMD64 mit -O2
kompiliert
if (atomic_flag_test_and_set(&atomic_flag_var) == 0) {
printf("Hello World\n");
}
if (atomic_compare_exchange_strong(&atomic_var, &clear, 1)) {
printf("Hello World\n");
}
auf eine von einem test
im ersten Fall gefolgt xchg
. Der andere erwartet eine cmpxchg
. Es ist unwahrscheinlich, dass Sie bemerkenswerte Unterschiede zwischen den beiden bemerken werden. Siehe diese Antwort: Relative performance of swap vs compare-and-swap locks on x86.
Also, welche zu verwenden? Wenn Sie eine atomare Flagge benötigen, verwenden Sie atomic_flag
. Der Standard garantiert, dass das Schloss frei ist. Für die anderen _Atomic
Typen gibt es keine Garantie.