繁体   English   中英

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

[英]Comparison semantics with std::atomic types

我试图找到定义std::atomic T类型比较语义的位置。

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

我想他们必须简单地对用户定义的对象(如memcmp )进行逐字节比较,但是我看不出在标准中明确提到了什么。

因此,假设我有:

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

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

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

注意:例如,atomic_compare_exchange_strong的作用是:(memcmp(object,Expected,sizeof(* object))== 0)memcpy(object,&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允许但不保证成功。

它的实现已定义。 它可能只是使用互斥锁,也可能是在内存Blob上使用了一些内在函数。 该标准只是对其进行定义,以使后者可以作为实施策略。

编译器在这里什么都不知道。 全部都在图书馆里。 由于它是模板,因此您可以阅读实现的实现方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM