我使用 C++ 很长时间了,现在我开始学习汇编并了解处理器的工作原理(不仅仅是为了好玩,而且我必须将其作为测试程序的一部分)。在学习汇编时,我开始听到一些在讨论多线程时到处听到的术语,因为我在科学计算中进行了大量的多线程处理。我正在努力了解全貌,我很乐意帮助我拓宽我的视野。
我了解到,最简单的公共汽车就像一辆复用器后跟解复用器。每个端点都接受一个地址作为输入,以便将两端与某些外部组件连接。两端可以根据地址指向内存、显卡、RAM、CPU 寄存器或其他任何东西。
现在回答我的问题:我不断听到人们争论是否使用互斥体或原子来保证线程安全(我知道没有最终的答案,这不是我的问题,但我的问题是关于比较)。Here例如,有人声称原子是如此糟糕,以至于它们会阻止处理器完成体面的工作由于总线锁定.
有人可以解释一下吗什么是总线锁定,详细一点,以及为什么它不像互斥锁,而据我所知,互斥锁需要至少两个原子操作来锁定和解锁。
来自英特尔® 64 和 IA-32 架构软件开发人员手册:
从 P6 系列处理器开始,当LOCK
prefix 是指令的前缀,并且正在访问的内存区域在处理器内部缓存,因此 LOCK# 信号通常不被置位。相反,只有处理器的缓存被锁定。在这里,处理器的缓存一致性机制确保操作在内存方面以原子方式执行。
有专门的非时间性的存储绕过缓存的指令。所有其他加载和存储通常都会通过缓存,除非内存页面被标记为不可缓存(例如 GPU 或 PCIe 设备内存)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)