失败与成功compare_exchange_strong与交流

时间:2019-03-15 13:08:55

标签: c++ multithreading atomic compare-and-swap atomic-swap

这是this question的后续问题。我正在实现一个附加的原子操作,我称之为load_strong,该原子操作在内部使用原子RMW操作,以利用C ++标准对获取全球最新写入值的保证(这比仅仅给出的更强的保证)原子负载,可以读取较早的值。

在不同平台上,compare_exchange_strong失败与compare_exchange_strong成功相比,正常交易的性能如何? 我认为在某些平台上发生故障的compare_exchange_strong可能比成功的平台快,因为仅获取最新的值,而不必写入任何值。在IA32上,即使失败的比较交换也执行原子写操作(写回旧值) [1]

在某些情况下,原子交换也可以工作,即检查原子变量的值时,只有一个“消费者”试图读取该值。原子交换是否通常比compare_exchange_strong快(因为不需要进行比较)?

目前,我正在按以下方式实现它(Atomic<T>源自std::atomic<T>):

template<class T>
T Atomic<T>::load_strong(std::memory_order order)
{
    T expected = T();
    std::atomic<T>::compare_exchange_strong(
        expected,
        expected,
        order,
        order);
    return expected;
}

如果原子交换比上述实现更快,我还必须介绍一种专用的load_strong更快版本,它不保留原子的值,而是使用原子交换。

相关:使用原子负载而不是RMW进行旋转时是否会提高性能? 一旦完成load_strong,就可以保证知道原子的最后一个值。如果我可以保证在我的load_strong之后只能进行一次外部写操作,那么其他线程的性能是否有所不同,这取决于我使用的是load_strong(或其潜在的更快版本)还是原子加载旋转写那个?

这与正在旋转的线程的性能无关,而是与操作的选择如何影响其他线程有关。我之所以这样问,是因为在x86上,原子负载是简单负载,并且不使用锁前缀(据我所知)。如果我在旋转时从不使用锁前缀,那么直观上看其他线程将不会因旋转而受到任何性能损失。
这是真的?在不同的架构上如何工作?

0 个答案:

没有答案