bool test_bitops(boost::atomic<value_type> & shared_value, size_t instance) { size_t shift = instance * 8; value_type mask = 0xff << shift; value_type expected = 0; for (size_t k = 0; k < 8; k++) { value_type mod = 1 << k; value_type tmp = shared_value.fetch_or(mod << shift, boost::memory_order_relaxed); if ( (tmp & mask) != (expected << shift)) return false; expected = expected | mod; } for (size_t k = 0; k < 8; k++) { value_type tmp = shared_value.fetch_and( ~ (1 << (shift + k)), boost::memory_order_relaxed); if ( (tmp & mask) != (expected << shift)) return false; expected = expected & ~(1<<k); } for (size_t k = 0; k < 8; k++) { value_type mod = 255 ^ (1 << k); value_type tmp = shared_value.fetch_xor(mod << shift, boost::memory_order_relaxed); if ( (tmp & mask) != (expected << shift)) return false; expected = expected ^ mod; } value_type tmp = shared_value.fetch_and( ~mask, boost::memory_order_relaxed); if ( (tmp & mask) != (expected << shift) ) return false; return true; }