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

标签 c++ c lock-free transactional-memory intel-tsx

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

如果事务不是原子的,那么 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/

相关文章:

c++ - 如何在 C++ 中搜索正则表达式?

python - boost::python 包装对象的 C++ 析构函数调用

multithreading - 无锁数据结构中需要多少个ABA标签位?

java - 使用无锁算法将值放入自定义对象的 Map 中

c++ - 将工作项添加到数组或列表的非阻塞方式

c++ - 如果一个对象在本地创建并在 C++ 中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch block 中?

c++ - 不是全局命名空间的成员?

c++ - 如何将递归转换为迭代解决方案

c - NULL 实现和指针赋值

python - 使用 free() 时出现无效指针错误