在写入该变量的唯一线程中使用 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 加载原子变量是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章