我想我可以使用__atomic_compare_exchange_n
代替__atomic_test_and_set
。
将这些内置函数用于 bool 值是否比其他函数有任何性能优势?
除了参数数量之外的任何输入都值得赞赏。
最佳答案
您最好使用C11的<stdatomic.h>
提供的API 。 __atomic
内置函数只是 GCC 在底层实现它们的方式,使用标准 API 使您的代码更加可移植。
__atomic_test_and_set
是 GCC 翻译的atomic_flag_test_and_set
至。__atomic_compare_exchange_n
是atomic_compare_exchange
.
AMD64 上的 gcc6 -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
。您不太可能体验到两者之间的任何明显差异。请参阅这个答案:Relative performance of swap vs compare-and-swap locks on x86 .
那么,该使用哪一个呢?如果您需要原子标志,请使用 atomic_flag
。该标准保证这是无锁的。对于任何其他 _Atomic
均不存在此类保证。类型。
关于c - __atomic_test_and_set 与 __atomic_compare_exchange_n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38743734/