线程之间的内存栅栏/屏障如何与其他线程中的栅栏/屏障交互?

Posted

技术标签:

【中文标题】线程之间的内存栅栏/屏障如何与其他线程中的栅栏/屏障交互?【英文标题】:How do memory fences/barriers among threads interact with fences/barriers in other threads? 【发布时间】:2021-03-19 12:28:08 【问题描述】:

不同线程中内存栅栏的交互是什么?

更具体地说,线程中的内存栅栏是否仅阻止线程内指令的重新排序,或者线程之间存在同步,例如一个线程等待直到另一个线程中达到相应的栅栏?如果多个线程具有相同类型的栅栏并且多个线程具有成对的栅栏,会发生什么情况?什么类型的栅栏需要在线程之间配对,它们是如何使用的?如果带有内存栅栏的代码以单线程方式运行会产生什么影响?

【问题讨论】:

这能回答你的问题吗? Does memory fencing blocks threads in multi-core CPUs? 【参考方案1】:

内存屏障与barrier 标签完全不同。

内存屏障仅对本地内核自己对一致共享内存的访问进行排序,因为这就是恢复顺序一致性所需的全部内容。与其他线程/内核没有直接交互。

如果您想要线程之间的同步,请使用释放/获取顺序。 https://preshing.com/20120913/acquire-and-release-semantics/

【讨论】:

以上是关于线程之间的内存栅栏/屏障如何与其他线程中的栅栏/屏障交互?的主要内容,如果未能解决你的问题,请参考以下文章

CyclicBarrier总结

内存栅栏

JAVA并发包源码分析循环栅栏:CyclicBarrier

高并发多线程安全之信号量线程组守护线程线程栅栏等的分析

(转载)java内存模型

CyclicBarrier 栅栏 原理,应用场景