gpt4 book ai didi

c++ - 保证原子性的单位操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:13 26 4
gpt4 key购买 nike

有没有办法在 C++ 中设置、清除、测试和翻转单个位作为原子操作?例如“compare_and_swap”的按位变体。

最佳答案

以原子方式操作位需要一个 compare_exchange RMW 以避免触及 atomic 变量中的其他位。测试一点不是修改操作,因此 load() 就足够了。

你必须添加范围错误检查

template<typename T, typename OP>
T manipulate_bit(std::atomic<T> &a, unsigned n, OP bit_op)
{
static_assert(std::is_integral<T>::value, "atomic type not integral");

T val = a.load();
while (!a.compare_exchange_weak(val, bit_op(val, n)));

return val;
}

auto set_bit = [](auto val, unsigned n) { return val | (1 << n); };
auto clr_bit = [](auto val, unsigned n) { return val & ~(1 << n); };
auto tgl_bit = [](auto val, unsigned n) { return val ^ (1 << n); };


int main()
{
std::atomic<int> a{0x2216};

manipulate_bit(a, 3, set_bit); // set bit 3

manipulate_bit(a, 7, tgl_bit); // toggle bit 7

manipulate_bit(a, 13, clr_bit); // clear bit 13

bool isset = (a.load() >> 5) & 1; // testing bit 5
}

关于c++ - 保证原子性的单位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44751700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com