GCC 中普通可复制类型的原子对象
Atomic objects of trivially copyable types in GCC
根据 C++ 标准,std::atomic
可以与任何普通可复制类型组合。但是,GCC 会产生以下错误消息:
#include <atomic>
struct TriviallyCopyableType {
int a, b, c, d;
};
int main() {
std::atomic<TriviallyCopyableType> a;
a.store({}); // undefined reference to `__atomic_store_16'
a.is_lock_free(); // undefined reference to `__atomic_is_lock_free'
}
Clang 和微软的编译器不要抱怨。难道我做错了什么?这是一个已知问题吗?毕竟,原子操作是多年前在 GCC 4.4 中实现的。除了使用不同的编译器之外,还有其他解决方法吗?由于 Clang 实现 std::atomic<TriviallyCopyableType>
甚至无锁,我不想使用显式锁定。
此答案根据评论整理而成。
您需要通过在命令行上指定 -latomic
来显式 link 程序中的原子操作库。
-mcx16
可以对 128 位数据类型启用无锁原子操作。
根据 C++ 标准,std::atomic
可以与任何普通可复制类型组合。但是,GCC 会产生以下错误消息:
#include <atomic>
struct TriviallyCopyableType {
int a, b, c, d;
};
int main() {
std::atomic<TriviallyCopyableType> a;
a.store({}); // undefined reference to `__atomic_store_16'
a.is_lock_free(); // undefined reference to `__atomic_is_lock_free'
}
Clang 和微软的编译器不要抱怨。难道我做错了什么?这是一个已知问题吗?毕竟,原子操作是多年前在 GCC 4.4 中实现的。除了使用不同的编译器之外,还有其他解决方法吗?由于 Clang 实现 std::atomic<TriviallyCopyableType>
甚至无锁,我不想使用显式锁定。
此答案根据评论整理而成。
您需要通过在命令行上指定 -latomic
来显式 link 程序中的原子操作库。
-mcx16
可以对 128 位数据类型启用无锁原子操作。