我有一个非原子变量my_var和一个std::mutex my_mut。到目前为止,在代码中,程序员遵循了以下规则:
每当程序员修改或写入
my_var时,他都会锁定和解锁my_mut。
假定这一点,Thread1执行以下操作:
my_mut.lock();
my_var.modify();
my_mut.unlock();下面是我脑海中想象的一系列事件:
my_mut.lock();之前,主内存中可能有多个my_var副本和一些本地缓存。这些值不一定是一致的,即使程序员遵循了规则。my_mut.lock();,以前执行的my_mut关键部分的所有写入都在内存中对此线程可见。my_var.modify();。my_mut.unlock();之后,主内存中可能有多个my_var副本和一些本地缓存。这些值不一定是一致的,即使程序员遵循了规则。这个线程末尾的my_var值在锁定my_mut的下一个线程中是可见的,当它锁定my_mut时。我一直很难找到一个源代码来验证这正是std::mutex应该如何工作的。我参考了C++标准。在ISO 2013中,我找到了以下部分:
[注意:例如,获取互斥体的呼叫将在包含互斥体的位置上执行获取操作。相应地,释放相同互斥的调用将对这些相同的位置执行释放操作。非正式地,在A上执行释放操作将强制其他内存位置上的先前副作用变得对其他线程可见,这些线程随后在A上执行消耗或获取操作。
我对std::mutex的理解正确吗?
发布于 2022-05-16 08:58:27
C++操作在操作之间的关系上,而不是某些特定的硬件术语(比如缓存内聚)。因此,C++标准有一个发生之前的关系,这大致意味着在完成所有的副作用之前发生的事情,因此在之后发生的时刻是可见的。
如果您有一个独占的关键会话,您已经输入了该会话,意味着无论在其中发生什么,都会在下次输入此关键部分之前发生。因此,任何相应的进入它将看到一切发生之前。这就是标准规定。其他一切(包括缓存内聚)都是实现的职责:它必须确保所描述的行为与实际发生的行为相一致。
https://stackoverflow.com/questions/72256050
复制相似问题