gpt4 book ai didi

c++ - std::mutex 是否强制缓存内聚?

转载 作者:行者123 更新时间:2023-12-05 01:23:34 25 4
gpt4 key购买 nike

我有一个非原子变量 my_var 和一个 std::mutex my_mut。我假设在代码中到目前为止,程序员都遵循了这条规则:

Each time the programmer modifies or writes to my_var, he locksand unlocks my_mut.

假设这样,Thread1 执行以下操作:

my_mut.lock();
my_var.modify();
my_mut.unlock();

这是我在脑海中想象的事件顺序:

  1. my_mut.lock(); 之前,主内存和一些本地缓存中可能有多个 my_var 拷贝。这些值不一定一致,即使程序员遵守了规则。
  2. 通过指令 my_mut.lock();,来自先前执行的 my_mut 临界区的所有写入对该线程在内存中都是可见的。
  3. my_var.modify(); 执行。
  4. my_mut.unlock();之后,主存和一些本地缓存中可能存在多个my_var拷贝。这些值不一定一致,即使程序员遵循了规则。此线程末尾的 my_var 的值将对锁定 my_mut 的下一个线程可见,在它锁定 my_mut 时。

我一直无法找到一个来源来验证这正是 std::mutex 应该如何工作。我查阅了C++标准。来自 ISO 2013 ,我找到了这个部分:

[ Note: For example, a call that acquires a mutex will perform anacquire operation on the locations comprising the mutex.Correspondingly, a call that releases the same mutex will perform arelease operation on those same locations. Informally, performing arelease operation on A forces prior side effects on other memorylocations to become visible to other threads that later perform aconsume or an acquire operation on A.

我对 std::mutex 的理解是否正确?

最佳答案

C++ 操作操作之间的关系,而不是某些特定的硬件术语(如缓存内聚)。所以 C++ 标准有一个happens-before 关系,这大致意味着无论什么之前发生都完成了它的所有副作用,因此在之后发生的那一刻是可见的。

假设您有一个您已进入的独占关键 session ,这意味着无论其中发生什么,都发生在下次进入此关键部分之前。所以任何进入它的人都会看到之前发生的一切。这就是标准的要求。其他所有内容(包括缓存内聚)都是实现的职责:它必须确保所描述的行为与实际发生的行为一致。

关于c++ - std::mutex 是否强制缓存内聚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72256050/

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