gpt4 book ai didi

C++11:确保一次写入多次读取的定义语义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:25 24 4
gpt4 key购买 nike

我想知道在以下情况下是否需要使用 std::atomic:

  • 一个(指向一个)成员变量在一个对象的构造函数中被初始化
  • 在未来的某个时刻,恰好有一个由某个线程写入
  • 其他几个线程正在同时读取它(读取发生在写入之前和之后)

如果我只寻找以下类型的一致性:

  • 线程看到成员变量的初始值或写入后的值
  • 每个线程最终在写入后看到值(前提是它运行的时间足够长)

如果是,我应该在加载/存储中使用哪种内存顺序(memory_order_consume、memory_order_acquire、memory_order_release、memory_order_acq_rel、memory_order_seq_cst)以获得尽可能少的开销?

举个例子,假设我想实现一个“静态”单链表,它只能在尾部插入并且永远不会删除或更改任何下一个指针,即:

 Entry {
...
const Entry* next; // or std::atomic<const Entry*> next;
Entry() : next(NULL) { ... }
...
};
void Insert(Entry* tail, const Entry* e) {
tail->next = e; // assuming tail != NULL (i.e. we always have a dummy node)
}

最佳答案

内存顺序仅指示其他线程看到哪些写入或读取其他变量而不是原子变量。如果您不关心与您的成员变量相关的线程中的其他写入或读取,您甚至可以使用 std::memory_order_relaxed

要质疑其他线程在您的原子变量上写入的速度有多快,标准如下:(§ 29.3.13)

Implementations should make atomic stores visible to atomic loads within a reasonable amount of time.

关于C++11:确保一次写入多次读取的定义语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com