英特尔TSX硬件事务性存储器非事务性线程会看到什么?

埃洛夫

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

如果事务不是原子的,那么是否仍然遵守x86上的写入顺序规则?如果看到写入#2,则可以保证它必须能够看到先前的写入#1。这仍然适用于作为事务的一部分进行的写操作吗?

我在任何地方都找不到这些问题的答案,我有点怀疑任何人都不会知道,但是至少当有人发现这是Google友好的答案之地时。

布赖恩

(我的答案基于英特尔®64和IA-32架构优化参考手册,第12章)

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

通过缓存一致性协议检测到数据冲突数据冲突会导致事务中止。在最初的实现中,检测到数据冲突的线程将以事务方式中止。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

英特尔TSX硬件事务性存储器非事务性线程会看到什么?

来自分类Dev

Java持久性中的事务性和非事务性缓存

来自分类Dev

Azure Blob存储是否具有事务性?

来自分类Dev

从调用非事务性方法的@Transactional方法在Spring 4.3

来自分类Dev

非事务性出站如何与Mule中的事务性入站一起工作

来自分类Dev

标准C ++事务性内存状态

来自分类Dev

CrudRepository .delete()方法是事务性的吗?

来自分类Dev

递归ROWNUM与事务性方法的使用

来自分类Dev

msmq队列必须是事务性的吗?

来自分类Dev

事务性死信队列已满

来自分类Dev

grails如何禁用方法的事务性

来自分类Dev

Grails服务不是事务性的吗?

来自分类Dev

测试IBM Integration Bus的事务性

来自分类Dev

跨表分区的事务性插入

来自分类Dev

Grails的事务性后台作业

来自分类Dev

递归ROWNUM与事务性方法的使用

来自分类Dev

事务性全系统升级

来自分类Dev

OpenSessionInView与事务性?(春季/休眠/ JPA)

来自分类Dev

使用 mysqli 的事务性语句

来自分类Dev

Springboot 1.5.7 / SpringDataJPA - 为什么默认情况下存储库中的方法并不都是事务性的

来自分类Dev

Java:在多线程和事务性环境中运行DAO类

来自分类Dev

如何在(多线程)事务性Spring / JPA中删除实体

来自分类Dev

Django w / MySQL非事务性更改表无法回滚

来自分类Dev

在Slick 3中进行事务性使用

来自分类Dev

使用OData进行事务性批处理

来自分类Dev

如何学习设计高度事务性的系统?

来自分类Dev

事务性消息驱动通道适配器

来自分类Dev

liquibase变更集的事务性回滚

来自分类Dev

在g ++中构建事务性内存C ++代码