假设您有两个线程,一个线程创建一个TSX事务,然后修改一些数据结构。另一个线程不执行任何类型的同步,并读取相同的数据结构。交易是原子的吗?我真的无法想象这是真的,因为如果afaik尝试读取由事务修改的缓存行,则无法阻止或重新启动它。
如果事务不是原子的,那么是否仍然遵守x86上的写入顺序规则?如果看到写入#2,则可以保证它必须能够看到先前的写入#1。这仍然适用于作为事务的一部分进行的写操作吗?
我在任何地方都找不到这些问题的答案,我有点怀疑任何人都不会知道,但是至少当有人发现这是Google友好的答案之地时。
(我的答案基于英特尔®64和IA-32架构优化参考手册,第12章)
事务对于读取是原子的,因为读取将导致事务中止,因此看起来它从未发生。在事务区域中,读取的高速缓存行(在L1中跟踪)被视为读集,而行则被视为从写集写入。如果另一个处理器从写集读取(以您的示例为例)或对读集或写集进行写,则存在数据冲突。
通过缓存一致性协议检测到数据冲突。数据冲突会导致事务中止。在最初的实现中,检测到数据冲突的线程将以事务方式中止。
因此,尝试事务的线程正在跟踪该行,并且在另一个线程发出其读取请求时将检测到冲突。它终止,并且“硬件将在XBEGIN指令的操作所提供的指令地址处重新启动”。在本章中,第二处理器的工作没有区别。无论是尝试事务还是执行简单读取都没有关系。
总而言之,所有线程(无论是否事务性)都看不到完整事务或什么都看不到。只有TSX事务中的线程才能看到内存的中间状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句