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;
}
}
不幸的是,它使用起来很不方便,就好像它是一个内置的运算符一样。