在写入该变量的唯一线程中使用 memory_order_relaxed 加载原子变量是不是安全?

Posted

技术标签:

【中文标题】在写入该变量的唯一线程中使用 memory_order_relaxed 加载原子变量是不是安全?【英文标题】:Is it safe to use memory_order_relaxed to load an atomic variable, when in the only thread that writes to that variable?在写入该变量的唯一线程中使用 memory_order_relaxed 加载原子变量是否安全? 【发布时间】:2015-09-25 23:11:08 【问题描述】:

我有一个写入原子变量的线程。 (使用 memory_order_release)。 线程 A

还有许多其他线程从该变量中读取。 (使用 memory_order_acquire)。 线程 B

在线程 A 中使用 memory_order_relaxed 读取该变量是否安全?

【问题讨论】:

提供的信息无法回答。我们不知道原子变量需要什么语义。例如,线程 A 是否写入其他内存,然后写入原子变量,并且您需要保证看到写入原子变量的其他线程看到之前的写入?还是不行? 【参考方案1】:

是的,它是安全的,因为它的行为与由单个线程操作的非原子变量相同。

例如,如果写释放在程序顺序中在轻松读取之前排序,并且没有其他写入该变量,那么轻松读取将看到写入写入的值-release (N3337 §1.10.12-13)。

【讨论】:

【参考方案2】:

是的,在线程 A 中读取变量时使用 memory_order_relaxed 就足够了。由于程序顺序,此读取将始终与写入保持 happens-before 关系,发生在同一线程中.

【讨论】:

以上是关于在写入该变量的唯一线程中使用 memory_order_relaxed 加载原子变量是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

C++11多线程-内存模型

允许多个线程一次读取给定条件变量,但只有一个线程写入

在 C# 中使用线程或队列写入文件

Servlet多线程问题

是否可以读取同一线程最后写入的值? [复制]

Thread专题 - 线程安全