我知道C ++中的 volatile 与Java中的含义不同,所以如果我正在为Windows编写C ++应用程序,我如何在两个线程之间共享变量而不允许为每个线程缓存自己的变量副本? 使用关键部分是否解决了这个问题,还是只允许原子性?
答案 0 :(得分:1)
实际上,在Visual Studio中,volatile
与Java(或C#)的含义几乎相同。或者至少,它曾经,并且仍然默认;有关详细信息,请参阅Microsoft's documentation。
也就是说,在标准C ++中,volatile
的确代表什么都没有。此外,在标准术语中,线程不会“缓存”任何内容,而您的问题也是格式错误的。相关概念是原子性和排序,后者的标准术语是“先发生过”关系。在这些概念中捕获了设计,实现和推理多线程算法所需的一切; “缓存”的概念与它无关。
标准C ++ 11提供了许多强制执行原子性和排序的机制。如果您询问有关实施特定算法的具体问题,您将获得更好的答案。
[更新,澄清]
请注意,我并不是说您使用的是错误的术语;我说你使用了错误的概念。
标准没有谈到使用不同单词的“缓存变量”......它没有谈论缓存变量()。这是因为这个概念既不必要也不足以推理线程。您可以了解有关缓存的所有信息,但仍然无法分析并发算法,您可以对缓存一无所知,并能够完美地分析它们。
同样,“直接访问变量”不仅仅是错误的谈话方式;在(标准)C ++中,概念是无意义的。当每个线程以不同的速率前进并以不同的顺序观察状态变化时,“立即行动”的概念并不意味着什么。在标准C ++中,根本没有“直接访问”或“现在”;只有之前发生过。
这不是一个学术观点。错误的并发心智模型几乎可以保证导致模糊的思维和草率的错误代码。
你的问题确实没有答案。正确的答案可能是使用std::atomic
或使用std::mutex
或使用std::atomic_thread_fence
,具体取决于您实际上要做的事情。我建议你问一个明确说明是什么的问题。