std :: mutex会创建一个围栏​​吗?

Tom*_*err 29 c++ multithreading mutex memory-model memory-barriers

如果我锁定std::mutex遗嘱,我总会得到一个记忆围栏?我不确定它是暗示还是强迫你获得围栏.

更新:

根据RMF的评论发现此参考文献.

多线程编程和内存可见性

Alo*_*ave 15

据我了解,这包含在:

1.10多线程执行和数据竞争

第5段:

该库定义了许多原子操作(第29条)和对互斥锁(第30条)的操作,这些操作被特别标识​​为同步操作.这些操作在使一个线程中的分配对另一个线程可见时起到特殊作用.在一个或多个存储器位置上的同步操作是消费操作,获取操作,释放操作,或获取和释放操作两者.没有相关内存位置的同步操作是围栅,可以是获取围栏,释放围栏,也可以是获取和释放围栏.此外,还有轻松的原子操作,它们不是同步操作,还有原子读 - 修改 - 写操作,它们具有特殊的特性.[注意:例如,获取互斥锁的呼叫将对包含互斥锁的位置执行获取操作.相应地,释放相同互斥锁的调用将在这些相同位置执行释放操作.非正式地,对A执行释放操作会强制其他内存位置上的其他内存位置对其他线程可见,以后对A执行消耗或获取操作."轻松"原子操作不是同步操作,即使像同步操作一样,他们不能参与数据竞赛. - 尾注]


R. *_*des 11

解锁互斥锁同步锁定互斥锁.我不知道编译器对实现有什么选择,但是你得到了相同的栅栏效果.

  • 我这样说:假设Core A写入'A [0]`然后释放互斥锁.然后,Core B获取互斥锁并读取"A [0]"(在缓存一致性之前可以将"A [0]"的新值传播到核心B.)换句话说,互斥锁是否强制所有存储器位置 - 在返回之前到目前为止. (8认同)
  • 我不明白.C++中的Fences不会影响特定的内存位置. (3认同)
  • 我认为OP正在询问除了互斥锁本身以外的其他内存位置的防护. (2认同)