英特尔TSX硬件事务内存非事务性线程看到了什么?

时间:2014-03-23 15:50:29

标签: c++ c lock-free

假设您有两个线程,一个创建TSX事务,并修改一些数据结构。另一个线程不进行任何类型的同步,并读取相同的数据结构。事务是原子的吗?我实际上无法想象它可能是真的,因为如果它尝试读取由事务修改的缓存行,则无法阻止或重新启动它。

如果事务不是原子的,那么x86上的写入顺序规则是否仍然受到尊重?如果它看到写#2,则保证它必须能够看到前一个写#1。对于作为事务的一部分发生的写入,这仍然适用吗?

我无法在任何地方找到这些问题的答案,我怀疑任何人都会知道,但至少当有人发现这是一个谷歌友好的地方来回答。

1 个答案:

答案 0 :(得分:3)

(我的答案基于Intel® 64 and IA-32 Architectures Optimization Reference Manual,第12章)

事务对于读取是原子的,因为读取将导致事务中止,从而看起来它从未发生过。在事务区域中,高速缓存行(在L1中跟踪)读取被认为是读取集和从写入集写入的行。如果另一个处理器从写入集(您的示例)读取或写入读取或写入集,则存在数据冲突。

  通过缓存一致性协议检测

数据冲突。   数据冲突导致事务中止。在最初   实现,检测数据冲突的线程会   交易中止。

因此,尝试事务的线程正在跟踪该行,并在另一个线程发出其读取请求时检测到该冲突。它中止并“硬件将在XBEGIN指令操作提供的指令地址重新启动”。在本章中,对第二个处理器正在做什么没有区别。无论是尝试交易还是执行简单的阅读都无关紧要。

总而言之,所有线程(无论是否是事务性的)都会看到完整的事务或什么都没有。只有TSX事务中的线程才能看到内存的中间状态。