gpt4 book ai didi

c++ - 释放获取语义以计算平均值的下限和上限

转载 作者:行者123 更新时间:2023-11-30 03:34:26 25 4
gpt4 key购买 nike

基于 previous question ,我想知道以下代码是否可以计算使用原子测量的属性的平均值的下限和上限:

std::atomic< unsigned int > m_accLower;
std::atomic< unsigned int > m_countLower;

std::atomic< unsigned int > m_accUpper;
std::atomic< unsigned int > m_countUpper;

// ...

void Class::UpdateLower( unsigned int delta )
{
m_countLower.fetch_add( 1 , std::memory_order_relaxed );
m_accLower.fetch_add( delta , std::memory_order_release );
}

double Class::GetAverageLower( )
{
auto acc = m_accLower.load( std::memory_order_acquire );
auto count = m_countLower.load( std::memory_order_relaxed );

return acc/(double)count;
}

void Class::UpdateUpper( unsigned int delta )
{
m_accUpper.fetch_add( delta , std::memory_order_relaxed );
m_countUpper.fetch_add( 1 , std::memory_order_release );
}

double Class::GetAverageUpper( )
{
auto count = m_countUpper.load( std::memory_order_acquire );
auto acc = m_accUpper.load( std::memory_order_relaxed );

return acc/(double)count;
}

假设下层更新和上层更新总是一起发布并且没有并发更新。

由于发布-在最后一个领域获得,但也许更多。双重情况发生在 GetAverageUpper() 中。

这个思路对吗?是否保证较低版本实际上始终获得平均值的下限,而较高版本实际上始终获得平均值的上限?

如果这些方法确实符合我的预期,那么实际平均值将在闭区间内:[GetAverageLower() , GetAverageUpper()]

最佳答案

在回答这个问题之前,我觉得有必要说明一点:
只需使用(宽松的)原子,您就可以保证一个线程将看到其他线程中发生的原子变化。内存重新排序与可见性无关。这是关于防止编译器和 CPU 扰乱代码行。

现在我们已经确定了这一点,如果您在同一线程中调用 GetAverageUpper 然后UpdateUpper 就会出现问题。内联后,合并后的代码将如下所示:

auto count = m_countUpper.load( std::memory_order_acquire );
auto acc = m_accUpper.load( std::memory_order_relaxed );
auto inlinedValue = acc/(double)count;
m_accUpper.fetch_add( delta , std::memory_order_relaxed );
m_countUpper.fetch_add( 1 , std::memory_order_release );

现在,编译器/CPU 无法重新排序 acquire 之前的任何行和 release 之后的任何代码行,但是这两个 relaxed 在中间?它们可以重新排序:

auto count = m_countUpper.load( std::memory_order_acquire );
m_accUpper.fetch_add( delta , std::memory_order_relaxed );
auto acc = m_accUpper.load( std::memory_order_relaxed );
auto inlinedValue = acc/(double)count;
m_countUpper.fetch_add( 1 , std::memory_order_release );

这当然会破坏您的代码逻辑。

关于c++ - 释放获取语义以计算平均值的下限和上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42008967/

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