IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11 推荐 const 修饰的成员函数 最好实现成线程安全的,否则就尽量不要这样修饰 -> 正文阅读

[C++知识库]C++11 推荐 const 修饰的成员函数 最好实现成线程安全的,否则就尽量不要这样修饰

  1. 总览

    • 核心

      • const修饰的成员函数理论上说是不会修改值的.

      • 如果有成员mutable,则是可以修改.

      • 修改就会遇到资源竞争和多线程安全问题。

    • 多线程安全

      • 只有多线程共享的数据才会有多线程安全问题。

      • 即一致性问题,其实对于某些数据,只有整个独占才能保证多线程安全。

      • 或者确认不共享,只有一个线程串行使用。

    • 文章内容

      • 多线程安全函数的案例不太靠谱。

      • 不过是针对C++98C++11来将,还是有一点内容的。

  2. 多线程安全

    • 读写模式

      • 采用volatile和内存屏障的形式保证一致性.

      • 修改方用函数修改了之后就写屏障使生效。读取方则短暂用读屏障,保证数据有效。

      • 适合特别短的代码等待。长等待需要用锁,让线程睡眠,以让出资源,而不是空转。

      • volatilebarrier一般是在C语言里面使用.

    • 统计模式

      • atomic类对基本类型实现原子操作. 效率没有上面的高,不过更安全可靠.

    • 长任务模式

      • 对于与需要常事件处理并占用一系列资源的情况. 需要用互斥。

      • mutex,sem,condition等.

  3. C++11

    • 简介

      • 支持了函数声明为const,表示函数不会修改类的成员数据,const类型.

      • 这类修饰表明了不会在函数中修改,不保证其他不会修改.

      • 仅仅是限制自身不会对内容进行修改.

    • 修饰目的

      • 用于多线程安全,虽然可能也会发生修改.

      • 但是语义上不能修改. 而自己开发的时候 也需要注意.

      • 虽然 也可以通过mutable修饰变量可修改.

    • const函数的本质

      • 普通函数,第一个参数是变量指针,第二三参数是其他.

      • 函数只能保障自己不会修改输入数据,即obj对象.

    • 发现问题

      • 编译阶段发现问题。

      • 可以较早发现这类错误做法。

      • 主要是不修改当前类的值。

    • 案例

      class T {
      public:
         void cool() const {
             x = 1;
         }
      public:
         mutable int x{0};
      };
      
      int main() {
         T d;
         d.cool();
      }
      
      • 这类是可以的,但是修改了值,就存在竞争问题。

      • 只读一般就不存在资源竞争问题。

    • 竞争的原因

      • CPU缓存一致性导致读写数据不对。

      • 不修改,只读就不存在问题。对共享数据改就存在问题。

  4. 总结

    • 建议const尽量做到多线程安全,即不修改数据.

    • std::atomicmutex效率高,使用场景是单个标量或者某个内存区间的值.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 21:57:27  更:2021-12-26 21:58:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:33:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码