我在Linux上使用gcc 4.7.2编译以下代码时,遇到了以下编译器错误:
function std::atomic::is_lock_free() const: error: undefined reference to '__atomic_is_lock_free'
struct S {
int a;
int b;
};
std::atomic<S> s;
cout << s.is_lock_free() << endl;
- 当没有无锁指令可用(无论是通过硬件还是操作系统支持)时,原子操作被留作函数调用以由库解决。由于时间限制和未最终确定的API,GCC 4.7没有提供libatomic。这可以通过遇到以
__atomic_*
开头的未满足的外部符号来轻松确定。
由于GCC 4.7没有提供libatomic
,您需要使用另一个实际支持所需功能或提供缺少功能的编译器(示例实现)。
std::atomic<S>
是标准的还是GCC扩展?cppreference只说明“完全特化”定义了原子类型,并提供了“以下完全特化”。 - Stephen LinT
大小足够小以便使用硬件原子指令处理(通常不大于最大整数类型),那么atomic<T>
可以是无锁的。 - Pete Becker