保证原子性的单位操纵

Single bit manipulations with guaranteed atomicity

本文关键字:单位 操纵 原子性      更新时间:2023-10-16

是否有一种方法可以设置,清除,测试和将单个位作为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
}

在整数中稍微翻转一点只是一个比较和交换操作。您正在使用它来测试和翻转一个位不会改变任何东西。因此,简单的compare_exchange_weak循环将执行此操作。

设置一些原子使用fetch_or(bit((也| =(

要清除一些原子,您可以使用fetch_and(〜bit((也&amp; =(

要对原子进行一些翻转,您可以使用fetch_xor(bit(