gpt4 book ai didi

c++ - 在哪些情况下我需要锁定变量以防止同时访问?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:13 26 4
gpt4 key购买 nike

在 C 或 C++ 程序中,如果 2 个线程使用同一个全局变量,则需要通过互斥量锁定该变量。

但具体在哪些情况下呢?

  1. 线程 1:阅读 线程 2:阅读
  2. 线程 1:写 线程 2:读
  3. 线程 1:写 线程 2:写

当然你需要在第 3 种情况下锁定,但其他 2 种情况呢?情况 2(使用非原子操作)会发生什么?是否存在某种访问冲突或线程 2 是否只是获取旧值?我对此有点困惑,因为不能同时访问硬件级别的内存和寄存器(在普通 PC 硬件中),或者我们是否有某种并行 CPU,带有并行总线到并行 ram 芯片?

最佳答案

想想每种情况下可能发生的情况。让我们只考虑竞争条件:这很容易,足以让我们看到结果。

在情况 1 中,变量未被修改,因此无论顺序如何,两个线程都将读取相同的值。所以基本上,这里没有任何问题。

情况 2 和 3 更糟。假设您有竞争条件,并且不知道哪个线程会更早获得访问权限。这意味着:

对于情况2:所有操作结束时变量的值都没有问题(会是线程1写入的值),但是线程2可能得到一个旧的变量值,这可能会导致崩溃,或其他问题。

对于情况 3:变量的结束值是不可预测的,因为它取决于最后执行写入操作的线程。

对于情况 2 和 3,也可能发生其中一个线程将尝试访问处于不一致状态的变量,并且您最终可能会得到其中一个线程读取的一些垃圾数据(即 Case 2),甚至在所有操作完成后变量中的数据都是垃圾。

是的,锁定案例 2 和 3。

关于c++ - 在哪些情况下我需要锁定变量以防止同时访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18016806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com