2016-08-03 35 views
2

Ich nehme an, ich kann __atomic_compare_exchange_n anstelle von __atomic_test_and_set verwenden.__atomic_test_and_set vs __atomic_compare_exchange_n

Gibt es irgendeinen Leistungsvorteil gegenüber anderen für die Verwendung dieser Builtins für boolesche Werte?

Jede andere Eingabe als die Anzahl der Argumente wird geschätzt.

Antwort

3

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.