本帖最后由 bestkakkoii 于 2024-2-25 15:05 编辑
炫::原子
何谓原子变量:
想象一下,你和你的朋友们正在玩一个传球游戏。这个游戏的规则是,在任何时刻,只有一个人能持有球,并且在他们把球传给另一个人之前, 没有其他人可以抢走球或者插手。 这个球就像是一个“原子变量”。
在现实生活中,我们处理的不是球,而是数据。 当多个人(在编程中,这些“人”是线程)尝试同时访问和修改同一份数据(比如一个变量)时,就会出现混乱, 就像多个人同时试图抓住和控制同一个球一样。 如果没有规则确保只有一个人(或线程)在任何时刻操作球(或数据),游戏(或程序)就会变得混乱不堪。
这里,“原子变量”就像是一种魔法球, 它自带规则:无论何时,只有一个人可以持有并操作这个球。 在编程中,炫::原子(cx::atomic) 类型提供了这种“魔法球”。当你把一个普通的变量声明为 炫::原子(cx::atomic) 类型, 你就确保了无论多少线程试图更新这个变量,每次只有一个更新能够同时发生,保证了操作的完整性。
用 炫::原子(cx::atomic) 的好处是,你不需要用锁或其他同步机制来保护变量的安全, 因为 炫::原子(cx::atomic) 本身就确保了当数据被一个线程修改时,其他线程不能同时修改它。这就像是每次传球都有一个看不见的保护圈,确保只有一个人可以接触球。这样,数据就像球一样,在多线程环境中安全地“传递”了。
简而言之,炫::原子(cx::atomic) 就像是一个带有特殊保护的变量,确保在多线程操作中,只有一个线程可以在任何时刻修改它,从而防止数据混乱和不一致的问题。
预定义原子类型:
cx::atomic_int; //@别名 炫::原子整数 等同于: 炫::原子<int> 此类型根据x64或x86自适应为8字节或4字节有符号整数
cx::atomic_int8; //@别名 炫::原子整数8 等同于: 炫::原子<char>
cx::atomic_uint8; //@别名 炫::原子无符号整数8 等同于: 炫::原子<BYTE>
cx::atomic_int16; //@别名 炫::原子整数16 等同于: 炫::原子<short>
cx::atomic_uint16; //@别名 炫::原子无符号整数16 等同于: 炫::原子<unsigned short>
cx::atomic_int32; //@别名 炫::原子整数32 等同于: 炫::原子<int>
cx::atomic_uint32; //@别名 炫::原子无符号整数32 等同于: 炫::原子<unsigned int>
cx::atomic_int64; //@别名 炫::原子整数64 等同于: 炫::原子<__int64>
cx::atomic_uint64; //@别名 炫::原子无符号整数64 等同于: 炫::原子<unsigned __int64>
cx::atomic_bool; //@别名 炫::原子逻辑 等同于: 炫::原子<bool>
cx::atomic_float; //@别名 炫::原子浮点 等同于: 炫::原子<float>
cx::atomic_double;
cx::atomic_real; //@别名 炫::原子双精度浮点 等同于: 炫::原子<double>
|
用法(适用绝大多数运算符):注意! 以下例子只是展示原子变量可以直接如同普通变量使用,请不要直接使用本例子
[C++] 纯文本查看 复制代码 cx::atomic_int n = 100;
++n;
--n;
n += 1;
n -= 1;
n *= 1;
n /= 1;
n %= 1;
n &= 1;
n |= 1;
n = 1 + n + 1;
n = 1 - n - 1;
n = 1 * n * 1;
n = 1 / n / 1;
n = 1 % n % 1;
n = 1 & n & 1;
n = 1 | n | 1;
公开函数:
以下 T 代表任意类型取决于你声明原子变量时所使用的内型,比如 炫::原子<整型> a 则 T 代表 整型
显式读取原子数值(非必须)
显式写入原子数值, 建议直接使用 = 运算符
显式原子加法, 建议直接使用 += 运算符
显式原子减法, 建议直接使用 -= 运算符
显式原子位与, 建议直接使用 &= 运算符
显式原子位或, 建议直接使用 |= 运算符
显式原子位异或, 建议直接使用 ^= 运算符
显式原子乘法, 建议直接使用 *= 运算符
显式原子除法, 建议直接使用 /= 运算符
显式原子取模, 建议直接使用 %= 运算符
|