如果我锁定了std::mutex
,我会不会得到一个记忆栏?我不确定它是否暗示或强制你获得围栏。是否std :: mutex创建一个围栏?
更新:
找到这个参考文献跟随RMF的评论。
Multithreaded programming and memory visibility
如果我锁定了std::mutex
,我会不会得到一个记忆栏?我不确定它是否暗示或强制你获得围栏。是否std :: mutex创建一个围栏?
更新:
找到这个参考文献跟随RMF的评论。
Multithreaded programming and memory visibility
解锁互斥与锁定互斥同步。我不知道编译器对于实现有什么选择,但是你可以得到相同的效果。
据我所知这是覆盖在:
1.10多线程执行和数据争
第5段:
库去连接定义了一个数的原子操作(第29条)和特别标识为同步操作的互斥体操作(第30条) 。这些操作在使一个线程中的分配对另一个线程可见时起到特殊作用。一个或多个存储器位置上的同步操作可以是消费操作,获取操作,释放操作或者获取和释放操作。没有关联的内存位置的同步操作是一个篱笆,可以是采集篱笆,释放篱笆,也可以是采集篱笆和释放篱笆。另外,还有宽松的原子操作,它们不是同步操作,还有原子读 - 修改 - 写操作,它们有特殊的特征。 [注意:例如,获取互斥锁的调用将对构成互斥锁的位置执行获取操作。相应地,释放相同互斥体的调用将对这些相同的位置执行释放操作。非正式地,对A执行释放操作会强制其他存储器位置上的先前的副作用对其他线程变得可见,这些线程稍后在A上执行消费或获取操作。“轻松”原子操作不是同步操作,即使像同步操作一样,他们无法参与数据竞赛。 - 结束]
我想OP是询问围栏以外的其他内存位置本身。 – Mysticial
我不明白。 C++中的栅栏不会影响特定的内存位置。 –
我这样说:假设核心A写入'A [0]'然后释放互斥锁。然后核心B获取互斥锁并读取'A [0]'(在缓存一致性可以将A [0]的新值传播到核心B之前)。换句话说,互斥锁是否强制所有存储单元上行,在返回之前为止。 – Mysticial