【发布时间】:2020-08-03 18:12:45
【问题描述】:
我认为 C++ 还没有涵盖任何类型的事务内存,但 TSX 仍然可以使用“as if 规则”以某种方式适应由 C++ 内存模型管理的东西。
那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?
说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“ok”的含义。
使用 HLE 可能可以将其视为“先前的操作发生在后续操作之前。就好像该部分仍然被被省略的锁所保护”。
RTM 是什么?因为甚至没有省略的锁,只有(可能是非原子的)内存操作,可以是加载、存储、两者,或无操作。什么与什么同步?在什么之前会发生什么?
【问题讨论】:
-
事务性内存 TS 暂时被搁置,因为它仍然“太小众”。就标准 C++ 而言,英特尔 TSX 只是未定义行为。具体实现可能有实现指定的行为;我会先检查 icc。
-
由于编译器为 TSX(HLE 和 RTM)提供了内在函数,我希望他们有一些理智的东西。所以我认为这个“理智的东西”可以映射到内存模型中。
-
我还认为,即使在正式标准功能之前,事务内存作为可选实现细节也有一些有用的案例。例如,参见
std::call_once的实现,它大部分时间都是从单个线程调用的,因此很可能受益于 HLE 省略的锁(当然,状态之间的转换是在潜在的省略锁下,而不是用户回调) .或者甚至可能是shared_ptr复制计数器,它们主要在单个线程中复制。
标签: c++ language-lawyer memory-model intel-tsx