c - __atomic_test_and_set 与 __atomic_compare_exchange_n

标签 c gcc locking atomic

我想我可以使用__atomic_compare_exchange_n代替__atomic_test_and_set

将这些内置函数用于 bool 值是否比其他函数有任何性能优势?

除了参数数量之外的任何输入都值得赞赏。

最佳答案

您最好使用C11的<stdatomic.h>提供的API 。 __atomic 内置函数只是 GCC 在底层实现它们的方式,使用标准 API 使您的代码更加可移植。

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/

相关文章:

c - 使用 C 代码在 Linux 中添加 mtrr 条目

c - : '=' : left operand must be l-value? 是什么意思

c - printf 没有打印出预期的结果,为什么?

ubuntu - 如何使用 libcurl 和 C : 从 IMAP 服务器读取消息

mysql - 我如何解决 MySQL INSERT INTO...SELECT 导致 SELECTed 表的写锁定?

当数据库有实时连接时,MySql 的 'CREATE DATABASE IF NOT EXISTS' 行为异常

c - 如何检测特定页面是否映射到内存中?

c - 我需要在 C 程序中编译头文件吗?

c# - 为什么这段代码不会死锁?

c++ - fork 命令是否适用于多线程应用程序?