2

C++11 doc 定义std::atomic::fetch_or()std::atomic::fetch_and()仅适用于 Integral 类型。这样,MSVC++ 2012就没有实现这个功能。有谁知道为什么?std::atomic<bool>

我只找到了这个解决方案。实现std::atomic_fetch_or<bool>和的专业化std::atomic_fetch_or<and>

namespace std
{
    template<>
    inline bool atomic_fetch_or<bool>(std::atomic<bool>* atom, bool val)
    {
        bool bRes = !val;
        atom->compare_exchange_strong(bRes, true);
        return bRes;
    }

    template<>
    inline bool atomic_fetch_or_explicit<bool>(std::atomic<bool>* atom,
        bool val, std::memory_order order)
    {
        bool bRes = !val;
        atom->compare_exchange_strong(bRes, true, order);
        return bRes;
    }


    template<>
    inline bool atomic_fetch_and<bool>(std::atomic<bool>* atom, bool val)
    {
        bool bRes = true;
        atom->compare_exchange_strong(bRes, val);
        return bRes;
    }

    template<>
    inline bool atomic_fetch_and_explicit<bool>(std::atomic<bool>* atom,
        bool val, std::memory_order order)
    {
        bool bRes = true;
        atom->compare_exchange_strong(bRes, val, order);
        return bRes;
    }
}

不幸的是,它使用起来很不方便,就好像它是一个内置的运算符一样。

4

0 回答 0