【发布时间】:2011-07-07 03:42:12
【问题描述】:
我是多线程世界的新手,并开始涉足它。我发现线程需要同步。易失性不再是可靠的东西。我想知道同步对象是否可以被编译器缓存或在任何阶段缓存?
使用的平台/语言:c++、win32、Windows
在 c++ 中,volatile 关键字用于 CPU 无法缓存的对象。但是今天的编译器并没有严格遵循这一点。是否有其他方法可以使同步对象不可缓存(或其他优化不适用于这些对象)。
tl;dr:同步对象可以缓存吗?如果是,如何使其不可缓存?
【问题讨论】:
-
真的很难理解你在问什么:这个问题有点含糊不清。您对同步对象有什么顾虑:即您担心它会发生什么?
-
如果同步对象被缓存在多个 CPU 上并且没有更新到内存。会发生这种情况吗?
-
当然,同步对象可能会被缓存,但这对同步块的影响很小。只要对对象的实际引用没有改变(即你没有让它指向不同的对象),那么你就不用担心了。
-
如果一个 CPU 更新内存而另一个没有更新新值怎么办?它会发生吗?或者内存的变化也会更新 CPU 缓存?
-
只要你不改变你的对象指向的东西,你对那个对象做了什么并不重要。
标签: c++ multithreading synchronization