【发布时间】:2018-10-29 17:56:17
【问题描述】:
在 C++ 中,我们有关键字 volatile 和 atomic 类。两者的区别在于 volatile 不保证线程安全的并发读写,只是保证编译器不会将变量的值存储在缓存中,而是从内存中加载变量,而 atomic 保证线程安全的并发读写。
众所周知,原子读取操作不可分割,即两个线程都不能向变量写入新值,而一个或多个线程读取变量的值,所以我认为我们总是读取最新的值,但是我不确定:)
所以,我的问题是:如果我们声明原子变量,我们是否总是得到调用load() 操作的变量的最新值?
【问题讨论】:
-
"但只是确保编译器不会将变量的值存储在缓存中,而是从内存中加载变量" - 不是这样,真的。它只是确保“严格按照抽象机的规则”访问值。 C++ 标准及其抽象机器对缓存一无所知。所以你不能假设没有缓存访问。
-
这不是 atomic 所能提供的:它为您提供一致的值(这意味着您将始终读取实际设置的值,而不是瞬态值)但这并不意味着最后一个值...比赛仍然存在,但至少价值观是好的
-
@OznOg 我想我明白了,但在什么情况下我们会得到一个陈旧的值,而不是最新的值?
-
不同步,线程可以随机顺序运行,因此一个可能会长时间休眠而另一个永远不会停止运行;您可以在一个线程中添加
sleep()来模拟这一点(这是突出比赛的常用方法)
标签: c++ multithreading atomic volatile