【发布时间】:2013-08-02 12:24:37
【问题描述】:
在 C 或 C++ 程序中,如果 2 个线程使用同一个全局变量,则需要通过互斥锁锁定 var。
但具体在哪些情况下呢?
- 线程 1:读取线程 2:读取
- 线程 1:写入 线程 2:读取
- 线程 1:写入线程 2:写入
当然,您需要锁定案例 3,但其他 2 个案例是什么?案例 2(非原子操作)会发生什么?是否存在某种访问冲突或线程 2 是否只是获得旧值?我对此有点困惑,因为不能同时访问硬件级别的内存和寄存器(在普通 PC 硬件中)或者我们是否有某种并行 CPU 具有并行总线线路到并行 ram 芯片?
【问题讨论】:
-
情况 2 和 3,即至少一个线程正在写入并且至少一个其他线程正在读取或写入的任何情况。
-
从不同线程访问数据时并不总是需要加锁。查看原子操作,尤其是 C++11 的
std::atomic -
是的,为了解决您的最后一句话,在多核 CPU 上,各个级别的缓存中的每个值都可以有多个副本。
-
(内核之间可能共享也可能不共享)
-
另外,请注意,在一个硬件上完全适合一个寄存器并且可以在一个 CPU 周期内完成对它的操作的东西,在另一个硬件上可能很容易需要多个周期。
标签: c++ c multithreading