gpt4 book ai didi

c++ - 英特尔 TSX 硬件事务内存非事务线程看到什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:04 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

Data conflicts are detected through the cache coherence protocol. Data conflicts cause transactional aborts. In the initial implementation, the thread that detects the data conflict will transactionally abort.

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

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

关于c++ - 英特尔 TSX 硬件事务内存非事务线程看到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com