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;
}
}
不幸的是,它不方便使用,就好像它是一个内置的操作符。