std :: atomic <bool> fetch_and()和fetch_or()实现</bool>

时间:2015-04-01 12:00:20

标签: c++ c++11 msvcrt c++-standard-library stdatomic

C ++ 11 doc仅为Integral类型定义std::atomic::fetch_or()std::atomic::fetch_and()。这样,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;
    }
}

不幸的是,它不方便使用,就好像它是一个内置的操作符。

0 个答案:

没有答案