与std :: atomic类型的比较语义

时间:2014-11-03 22:25:42

标签: c++ atomic

我正在尝试找到T类型与std::atomic的比较语义的位置。

我知道除了整数类型的内置专精之外,T可以是任何TriviallyCopyable类型。但compare_and_exchange_X等操作如何知道如何比较 T的实例?

我想他们必须简单地对用户定义的对象进行逐字节比较(如memcmp),但我没有看到标准中明确提到的位置。

所以,假设我有:

struct foo
{
  std::uint64_t x;
  std::uint64_t y;
};

当我致电std::atomic<foo>时,编译器如何知道如何比较两个std::atomic<foo>::compare_and_exchange_weak()个实例?

2 个答案:

答案 0 :(得分:3)

在草案n3936中,memcmp语义在第29.6.5节中有明确描述。

  

注意:例如,atomic_compare_exchange_strong的效果是       if(memcmp(object,expected,sizeof(* object))== 0)           memcpy(object,&amp; desired,sizeof(* object));       其他           memcpy(expected,object,sizeof(* object));

  

注意:如果基础类型具有填充位,则比较和交换操作的memcpymemcmp语义可能导致与operator==相等的值的比较失败,陷阱位,或相同值的替代表示。

至少自n3485以来,该措辞一直存在。

请注意,只有memcmp(p1, p2, sizeof(T)) != 0compare_and_exchange_weak有意义(保证失败)。 memcmp(p1, p2, sizeof(T)) == 0允许但不保证成功。

答案 1 :(得分:0)

定义了它的实现。它可能只是使用互斥锁,或者它可能在内存blob上使用一些内在函数。标准只是定义它,以便后者可以作为实施策略。

编译器在这里不知道任何事情。它都在图书馆里。由于它是一个模板,您可以阅读您的实施方式。

相关问题