【发布时间】:2018-05-26 02:19:26
【问题描述】:
我目前正在尝试学习 C++11 线程 API,但我发现各种资源并未提供基本信息:如何处理 CPU 缓存。现代 CPU 的每个内核都有一个缓存(意味着不同的线程可能使用不同的缓存)。这意味着一个线程可以将一个值写入内存,而另一个线程看不到它,即使它看到第一个线程也进行了其他更改。
当然,任何好的线程 API 都提供了解决这个问题的方法。然而,在 C++ 的线程 API 中,尚不清楚这是如何工作的。我知道std::mutex,例如,以某种方式保护内存,但不清楚它的作用:它是否清除整个 CPU 缓存,是否只清除互斥体内部访问的对象从当前线程的缓存中,还是别的什么?
此外,显然,只读访问不需要互斥体,但如果线程 1,并且只有线程 1,不断写入内存以修改对象,其他线程可能不会看到该对象的过时版本,因此需要某种形式的缓存清除?
原子类型是否只是绕过缓存并使用单个 CPU 指令从主内存中读取值?他们是否对内存中的其他位置被访问做出任何保证?
在 CPU 缓存的上下文中,C++11 的线程 API 中的内存访问如何工作?
一些问题,例如this one 谈论内存栅栏和内存模型,但似乎没有来源在 CPU 缓存的上下文中解释这一点,这就是这个问题所要求的。
【问题讨论】:
-
读懂C++11的内存模型,就明白了
-
@john01dav 请问你能在 2 年后回答这个问题吗?我仍在努力寻找这个答案。写入 1 个线程的互斥锁的值会在另一个线程的互斥锁中更新吗???请解释并回答
标签: c++ multithreading c++11 cpu-cache