保证原子性的单位操纵
Single bit manipulations with guaranteed atomicity
是否有一种方法可以设置,清除,测试和将单个位作为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(
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- C++setiosflags函数操纵器-未确定的缩进
- RcppEigen 模板化函数,用于填充单位法线
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 从原始字节解码协议缓冲区(以 C++为单位)
- ANTLR - 如何从维度扩展单位
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- C++表达SFINAE和ostream操纵器
- 编写以 C++ 为单位返回值的函数
- 操纵安卓相机的深度图导致应用程序崩溃
- 纹理单位重叠?渲染了错误的纹理
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- Cuda:具有位集数组的 XOR 单位集
- 以C++为单位进行运行长度编码
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- arr[n] 是否以 C++ 为单位打印数组的长度?
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 保证原子性的单位操纵