我想我可以用__atomic_compare_exchange_n代替__atomic_test_and_set。
在布尔值中使用这些内置程序有任何性能上的好处吗?
除参数数外的任何输入都将受到赞赏。
发布于 2016-08-03 14:16:40
最好使用C11的<stdatomic.h>提供的API。__atomic内置器正是GCC在幕后实现它们的方式,使用标准API使您的代码更易于移植。
__atomic_test_and_set就是GCC把atomic_flag_test_and_set翻译成的。__atomic_compare_exchange_n是atomic_compare_exchange。gcc6 on AMD64和-O2编译
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");
}在第一种情况下,转到xchg,然后是test。另一个期待着一个cmpxchg。这是不太可能的,你将经历任何明显的差异,两者之间。看这个答案:x86上交换锁与比较锁和交换锁的相对性能。
那么,用哪一种呢?如果需要原子标志,请使用atomic_flag。标准保证这将是无锁的。其他任何_Atomic类型都不存在这样的保证。
https://stackoverflow.com/questions/38743734
复制相似问题