首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::原子与boost::可选的不同行为与boost 1.55和1.58

boost::原子与boost::可选的不同行为与boost 1.55和1.58
EN

Stack Overflow用户
提问于 2015-05-28 07:51:04
回答 1查看 1K关注 0票数 1
代码语言:javascript
复制
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以来,我一直在运行原子和可选的更改日志,但是我发现没有什么能真正解释这种行为。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 08:07:13

比如std::atomic requires trivially copyable typesboost::optional并不是微不足道的可复制的,所以您只是得到了未定义的行为。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30500378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档