炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 187|回复: 0

[图文教程] ♦ 炫扩展模块 - 线程安全容器 - 炫::原子

[复制链接]
  • TA的每日心情
    闭嘴
    2024-4-8 11:56
  • 发表于 2024-2-25 13:22:08 | 显示全部楼层 |阅读模式
    本帖最后由 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 代表 整型

    • T load() const

    显式读取原子数值(非必须)

    • void store(T desired)

    显式写入原子数值, 建议直接使用 = 运算符

    • T fetch_add(T arg)

    显式原子加法, 建议直接使用 += 运算符

    • T fetch_sub(T arg)

    显式原子减法, 建议直接使用 -= 运算符

    • T fetch_and(T arg)

    显式原子位与, 建议直接使用 &= 运算符

    • T fetch_or(T arg)

    显式原子位或, 建议直接使用 |= 运算符

    • T fetch_xor(T arg)

    显式原子位异或, 建议直接使用 ^= 运算符

    • T fetch_mul(T arg)

    显式原子乘法, 建议直接使用 *= 运算符

    • T fetch_div(T arg)

    显式原子除法, 建议直接使用 /= 运算符

    • T fetch_mod(T arg)


    显式原子取模, 建议直接使用 %= 运算符



    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-5-2 20:08 , Processed in 0.065637 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表