首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clang支持双字比较和交换操作吗?

clang支持双字比较和交换操作吗?
EN

Stack Overflow用户
提问于 2013-08-25 19:44:32
回答 2查看 1.7K关注 0票数 3

我一直在阅读安东尼威廉姆斯( Anthony )的书“实践中的并发性”中的例子并对其进行编码,需要使用-mcx16为gcc4.8启用双字比较和交换,以便能够以无锁的原子方式操作包含指针的结构(一个int )。

Clang (任何版本)在x64上支持双字比较和交换吗?

以下代码给出了GCC4.8和Clang 3.3中的链接错误,但没有额外的编译器选项:

代码语言:javascript
复制
#include <atomic>
#include <thread>

struct ReferenceCountedPointer
{
  int referenceCount;
  void* data;
};

int main()
{
  std::atomic<ReferenceCountedPointer> arcp;
  ReferenceCountedPointer rcp;

  arcp.compare_exchange_weak(rcp, rcp);

  return 0;
}

上面的程序毫无意义,但说明了我看到的链接错误。

我为Clang和GCC使用的编译命令如下:

Clang 3.3:

代码语言:javascript
复制
clang++-mp-3.3 -std=c++11 -stdlib=libc++ CX16.cpp -o CX16

在以下方面失败:

代码语言:javascript
复制
Undefined symbols for architecture x86_64:
"___atomic_compare_exchange", referenced from:
  _main in CX16-plVSvq.o
ld: symbol(s) not found for architecture x86_64

GCC4.8:

代码语言:javascript
复制
g++-mp-4.8 -std=c++11 CX16.cpp -o CX16

在以下方面失败:

代码语言:javascript
复制
Undefined symbols for architecture x86_64:
"___atomic_compare_exchange_16", referenced from:
  std::atomic<ReferenceCountedPointer>::compare_exchange_weak(ReferenceCountedPointer&,        ReferenceCountedPointer, std::memory_order, std::memory_order) in ccOjp95s.o
ld: symbol(s) not found for architecture x86_64
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-25 20:07:58

ReferenceCountedPointer在很小程度上是可以复制的,因此在C++11下代码是有效的,显然库不符合标准。

票数 1
EN

Stack Overflow用户

发布于 2013-08-25 19:53:42

这里的问题是,有些64位处理器的模型没有cmpxchg16b-mcx16告诉编译器“我知道这个处理器支持cmpxchg16b指令,所以您可以生成它”。这是为了避免旧的64位处理器出现不支持此指令的问题--然后它们会导致“非法操作码陷阱”。例如,它与使用SSE4是一样的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18432978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档