当前位置: 首页 > article >正文

笔记9.18

线程之间的通信是指在多线程程序中,不同线程之间如何交换数据或协调工作。这种通信对于实现复杂的并发程序是至关重要的。以下是几种常见的线程间通信方式:

  1. 共享内存

    • 这是最直接的方式,多个线程通过读写同一块内存区域(如全局变量)来交换信息。但是这种方式需要特别注意同步问题,比如使用互斥锁(Mutex)、信号量(Semaphore)等机制来防止数据竞争和死锁。
  2. 消息传递

    • 在某些编程环境中,线程可以通过发送消息来进行通信。每个线程都有自己的私有队列,消息被放入接收者的队列中等待处理。这种方式可以减少线程间的耦合度,并且易于实现非阻塞操作。
  3. 管道(Pipes)

    • 管道是一种进程间通信方式,也可以用于线程间通信。一个线程写入管道的数据可以被另一个线程读取。管道分为匿名管道和命名管道两种类型,前者只能用于具有亲缘关系的进程间通信,后者则不受此限制。
  4. 信号(Signals)

    • 信号是一种异步通知机制,当某个特定事件发生时,系统会向进程发送一个信号。虽然信号主要用于进程间通信,但在某些情况下也可以用作线程间通信的一种手段。
  5. 条件变量(Condition Variables)

    • 条件变量通常与互斥锁一起使用,允许一个或多个线程等待直到某个特定条件为真。这在实现生产者-消费者模式等场景中非常有用。
  6. 事件(Events)

    • 事件对象提供了一种简单的同步机制,其中一个线程设置事件的状态,而其他线程可以等待该状态的变化。这在Windows操作系统中尤其常见。
  7. 屏障(Barriers)

    • 屏障是一种同步点,所有到达这个点的线程都会被阻塞,直到所有参与的线程都到达了这个点。这是实现多线程协作完成任务的一种有效方法。
  8. static 和 const 是 C/C++ 中常用的两个关键字,它们各自有不同的用途和特性。下面详细解释两者的区别:

    const
    const 关键字用于声明一个常量,表示该变量的值在初始化后不能被修改。const 可以应用于各种数据类型,包括基本数据类型、指针、函数参数等。

    特点:
    不可变性:一旦初始化,const 变量的值不能被改变。
    存储位置:const 变量通常存储在只读内存区域,编译器会对其进行优化。
    作用域:const 变量的作用域取决于其声明的位置。可以在局部作用域(函数内部)或全局作用域声明。
    示例:

    const int a = 10;  // 全局常量
    void func() {
        const int b = 20;  // 局部常量
    }


    static
    static 关键字用于控制变量的存储方式和作用域。它主要有以下几个用途:

    1. 静态局部变量:
    在函数内部声明的 static 变量在函数调用之间保持其值。
    初始化:静态局部变量只在第一次进入函数时初始化一次。
    生命周期:静态局部变量的生命周期贯穿整个程序运行期。
    作用域:静态局部变量的作用域仍然限于声明它的函数内部。
    示例:

    void func() {
        static int count = 0;
        count++;
        std::cout << "Count: " << count << std::endl;
    }


    2. 静态全局变量:
    在文件作用域内声明的 static 变量仅在声明它的文件内可见,不能被其他文件访问。
    初始化:静态全局变量在程序启动时初始化。
    生命周期:静态全局变量的生命周期贯穿整个程序运行期。
    作用域:静态全局变量的作用域限于声明它的文件。
    示例:

    // file1.cpp
    static int globalVar = 10;
    
    void func1() {
        std::cout << "globalVar: " << globalVar << std::endl;
    }
    
    // file2.cpp
    // int globalVar;  // 这里无法访问 file1.cpp 中的 globalVar


    3. 静态成员变量:
    在类中声明的 static 成员变量属于类本身,而不是类的任何特定对象。
    初始化:静态成员变量必须在类外部初始化。
    生命周期:静态成员变量的生命周期贯穿整个程序运行期。
    作用域:静态成员变量的作用域限于声明它的类。
    示例:

    class MyClass {
    public:
        static int staticVar;
    };
    
    int MyClass::staticVar = 0;  // 静态成员变量的初始化
    
    void func() {
        MyClass::staticVar++;
        std::cout << "StaticVar: " << MyClass::staticVar << std::endl;
    }


    总结
    const:用于声明常量,表示该变量的值在初始化后不能被修改。
    static:用于控制变量的存储方式和作用域,可以用于局部变量、全局变量和类成员变量。
    两者在用途和特性上有明显的区别,但在实际编程中经常结合使用,以实现更复杂的功能和更好的代码组织。


http://www.kler.cn/news/316933.html

相关文章:

  • C++速通LeetCode中等第1题-字母异位词分组
  • 在vue中:style 的几种使用方式
  • 【Elasticsearch系列五】Java API
  • Day30_0.1基础学习MATLAB学习小技巧总结(30)——优化工具箱及
  • prime1靶机渗透 (信息收集 内核提权)
  • H5白色大方图形ui设计公司网站HTML模板源码
  • DSP学习00-F28379D学习准备(了解一个工程的构成)
  • python mysql pymysql 数据库操作,常用脚本,个人小工具
  • 通过 LabVIEW 正则表达式读取数值(整数或小数)
  • Java基础尚硅谷85-面向对象特征一:封装性
  • Java中的事件(动作监听-ActionListener)
  • 如何使用ssm实现企业文档管理系统+vue
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】
  • Tcping:一款实用的端口存活检测工具
  • spring自定义属性编辑器
  • 本地生活商城开发搭建 同城O2O线上线下推广
  • 为什么 Feign 要用 HTTP 而不是 RPC?
  • Dify创建自定义工具,调用ASP.NET Core WebAPI时的注意事项(出现错误:Reached maximum retries (3) for URL ...)
  • Java_Day03学习
  • 前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
  • 江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
  • web基础—dvwa靶场(十一)CSP Bypass
  • Linux相关概念和重要知识点(6)(make、makefile、gdb)
  • SQLServer数据分页
  • Python 中的函数装饰器:理解 @property、Getter 和 Setter 方法
  • (算法)大数的进制转换
  • ESP32-WROOM-32 [创建AP站点-客户端-TCP透传]
  • PostgreSQL中的regexp_split_to_table函数详解,拆分字段为多行
  • C++之STL—vector容器进阶篇