boost::atomic 具有 boost::optional 提升 1.55 和 1.58 的不同行为

boost::atomic with boost::optional different behavior with boost 1.55 and 1.58

struct Foo
{
   void updateMin(const int& value);

   boost::atomic<boost::optional<int>> m_min; //multi-thread access
};

void Foo::updateMin(const int& value)
{
    auto currentMin = m_min.load(boost::memory_order_relaxed);
    int newMin;

    do
    {
        if (!currentMin)
            newMin = value;
        else
        {
            newMin = std::min(value, currentMin.get());
            if (newMin == currentMin)
                break;
        }

    } while (!m_min.compare_exchange_weak(currentMin, boost::optional<int>(newMin), boost::memory_order_relaxed));
}

使用 boost 1.55,上面的代码可以正常工作。

当我尝试将 boost 版本更新到 1.58 时,compare_exchange_weak 系统性地失败并导致无限循环。

自 1.55 以来,我已经查看了 atomic 和 optional 的更改日志,但我发现没有任何明显的东西可以解释这种行为。

有什么想法吗?

喜欢 std::atomicboost::atomic requires trivially copyable typesboost::optional 不可复制,所以你只会得到未定义的行为。

顺便说一下,compare_exchange_* 比较对象就像 memcmp,所以它也会考虑任何填充字节。