我正在学习硬件事务内存(HTM),但它的详细实现是有限的。我知道 HTM 中的事务缓冲其在 L1cache 中的读/写集,并通过缓存一致性协议检测冲突。我学到的使用HTM的程序案例如下。
while (1) { // keep trying
int status = _xbegin(); // set status = -1 and start transaction
if (status == _XBEGIN_STARTED) { // status == XBEGIN_STARTED == -1
(*a) ++; // non atomic increment of shared global variable
(*b) ++;
_xend(); // end transaction
break; // break on success
} else { //
x_abort(0xff);
} //
}
所以,我很困惑当“(*a)++”和“(*b)++”之间发生冲突时会发生什么。说,T0增加a,而T1读a。缓存协议将检测到冲突并中止 T0。但是T0会发生什么?它会继续运行其余代码,即 (*b)++ 和 _xend() 吗?我认为它不会继续运行,而是会重试。但是它怎么知道循环的起点在哪里呢?这个具体怎么实现的?