我知道 C++ 中的 volatile 与 Java 中的含义不同,所以如果我正在为 Windows 编写 C++ 应用程序,我如何在两个线程之间共享一个变量并且不允许为每个线程缓存自己的变量拷贝? 使用临界区能解决这个问题还是只允许原子性?
最佳答案
实际上,在 Visual Studio 中,volatile
与在 Java(或 C#)中的含义几乎相同。或者至少,它过去是,现在仍然是默认的;见Microsoft's documentation了解详情。
也就是说,在标准 C++ 中,volatile
确实几乎没有任何意义。此外,在标准术语中,线程不会“缓存”任何内容,并且您的问题格式不正确。相关概念是原子性 和顺序,后者的标准术语是“先发生”关系。您设计、实现和推理多线程算法所需的一切都包含在这些概念中; “缓存”的概念与它无关。
标准 C++11 提供了许多机制来强制执行原子性和顺序。如果您提出有关实现特定算法的特定问题,您将获得更好的答案。
[更新,澄清]
请注意,我并不是说您使用了错误的术语;我是说你使用了错误的概念。
该标准没有使用不同的词谈论“缓存变量”......它根本没有谈论缓存变量。那是因为这个概念对于线程的推理既不是必要的也不是充分的。可以对缓存无所不知,仍然无法分析并发算法,可以对缓存一无所知,也可以完美分析。
同样,“直接访问变量”不仅仅是错误的说法;这个概念在(标准)C++ 中毫无意义。当每个线程以不同的速度进行并以不同的顺序观察状态变化时,“现在就做”的概念毫无意义。在标准 C++ 中,根本没有“直接访问”或“立即访问”;只有 happens-before。
这不是学术观点。错误的并发心智模型几乎肯定会导致思维模糊和草率、错误的代码。
您的问题确实没有措辞的答案。正确的答案可能是使用 std::atomic
或使用 std::mutex
或使用 std::atomic_thread_fence
,具体取决于你实际上想做什么。我建议你问一个清楚说明那是什么的问题。
关于c++ - 强制两个线程直接访问内存中的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072990/