atomic
atomic 是什么及相关操作介绍1. atomic 是什么在 C++ 中,std::atomic 是 C++11 引入的模板类,位于 <atomic> 头文件中,用于实现线程安全的原子操作。原子操作是指在多线程环境中不可分割的操作,保证操作要么完全完成,要么完全不执行,避免数据竞争(data race)。 作用: 提供线程安全的变量读写,防止多线程并发访问导致的数据不一致。 避免使用锁(如互斥锁),减少锁竞争和上下文切换开销。 支持基本数据类型(如 int、bool、指针)和其他自定义类型的原子操作。 典型场景: 多线程计数器。 无锁数据结构(如无锁队列)。 标志位或状态变量的线程安全更新。 2. std::atomic 的核心特性 原子性:操作不可中断,确保线程安全。 内存序:通过 std::memory_order 控制内存访问顺序,优化性能和一致性。 支持类型: 内置类型:std::atomic<int>、std::atomic<bool>...
无锁循环队列
无锁循环队列无锁循环队列(Lock-Free Circular Queue)是一种线程安全的环形缓冲区数据结构,允许多个线程并发访问而无需使用锁(如互斥锁)。它通过原子操作(如 CAS,Compare-And-Swap)确保线程安全,适用于高并发场景,如生产者-消费者模型。 1. 无锁循环队列的特点 循环队列: 使用固定大小的数组,首尾相连形成环形结构。 通过模运算(% size)实现循环索引。 无锁: 使用原子操作(如 std::atomic)避免锁竞争,减少上下文切换和锁开销。 适合多线程环境,降低阻塞,提高吞吐量。 线程安全: 允许多个生产者(push)和消费者(pop)并发操作。 需处理并发时的竞争和一致性问题。 限制: 通常固定大小(非动态扩展)。 实现复杂,需谨慎处理边界条件和 ABA 问题。 2. 实现原理无锁循环队列通常基于以下关键点: 原子变量:使用 std::atomic 管理头(head)和尾(tail)索引,确保线程安全的更新。 CAS...
类和结构体
类和结构体的区别类和结构体是面向对象编程中两种重要的数据结构,它们有以下主要区别: 1. 默认访问控制 类:成员默认为私有(private) 结构体:成员默认为公开(public) 2. 内存分配位置 类:通常在堆(heap)上分配内存 结构体:通常在栈(stack)上分配内存 3. 继承特性 类:可以实现继承、多态等完整的面向对象特性 结构体:在许多语言中不支持继承或有限支持继承 4. 语言差异不同编程语言对类和结构体的区别处理不同: C++1234567891011struct Point { int x; // 默认public int y;};class Point { int x; // 默认private int y;public: void setPoint(int a, int b) { x = a; y = b; }}; C#12345678910111213// 值类型,存储在栈上struct Point { public int X; ...
OSI模型
我们一般说网络有七层,是指OSI模型,从下到上依次为: 物理层 (Physical Layer) 数据链路层 (Data Link Layer) 网络层 (Network Layer) 传输层 (Transport Layer) 会话层 (Session Layer) 表示层 (Presentation Layer) 应用层 (Application...
构造函数
C++中的构造函数在C++中,构造函数是类中用于初始化对象的特殊成员函数。它们与类同名,没有返回类型(连void也没有)。以下是C++中常见的构造函数类型: 1. 默认构造函数 定义:不带参数或所有参数有默认值的构造函数。 作用:创建对象时无需提供初始值。 示例:1234567class MyClass {public: MyClass() { x = 0; } // 默认构造函数private: int x;};MyClass obj; // 调用默认构造函数 2. 参数化构造函数 定义:带参数的构造函数,用于初始化对象的成员。 作用:允许通过参数传递初始值。 示例:1234567class MyClass {public: MyClass(int val) : x(val) {} // 参数化构造函数private: int x;};MyClass obj(10); // 调用参数化构造函数 3....
http,tcp与websocket
HTTP协议、TCP协议、WebSocket的区别以下是HTTP协议、TCP协议和WebSocket的区别,从定义、功能、特点等多个方面进行比较: 1. TCP协议 定义:TCP(Transmission Control Protocol,传输控制协议)是传输层协议,属于OSI模型的第四层或TCP/IP模型的传输层。 功能: 提供可靠的、面向连接的数据传输。 确保数据按序到达、无丢失、无重复,通过三次握手建立连接、四次挥手断开连接。 提供流量控制和拥塞控制机制。 特点: 可靠性:通过确认机制(ACK)、重传机制和错误检测确保数据完整性。 面向连接:通信前需建立连接,通信后需断开连接。 适用场景:需要高可靠性的场景,如文件传输(FTP)、电子邮件(SMTP)、HTTP等。 缺点:相比UDP,开销较大,速度较慢。 与HTTP/WebSocket的关系: TCP是HTTP和WebSocket的底层传输协议,HTTP和WebSocket依赖TCP提供可靠的数据传输。 2. HTTP协议 定义:HTTP(HyperText Transfer...
进程的信息与如何设置进程退出
查看进程信息与设置进程优雅退出以下是如何在Linux/Unix系统中查看进程信息以及设置进程优雅退出的方法,使用常用命令和工具,结合C++编程示例。 1. 查看进程信息方法1:使用 ps 命令ps 命令用于显示进程信息,常用选项如下: ps aux:显示所有用户的所有进程。 a:显示所有用户的进程。 u:显示详细用户信息。 x:显示无终端的进程。 ps -ef:显示所有进程,包含完整命令行。 ps -p <PID>:查看指定进程ID(PID)的详细信息。 示例:查看所有进程的PID、用户、CPU/内存使用情况: 1ps aux 输出示例: 123USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 123456 7892 ? Ss Jun28 0:01 /sbin/initalice 1234 1.2 0.5 987654 12345 pts/0 S ...
stl中的无序关联容器底层实现
unordered_map 时间复杂度与底层实现以下是对 C++ 中 unordered_map 时间复杂度、底层实现以及哈希冲突解决方法的详细分析。 1. unordered_map 时间复杂度unordered_map 是 C++ STL 中的无序关联容器,基于哈希表实现。其操作的时间复杂度如下: 平均情况: 插入(insert)、查找(find)、删除(erase):( O(1) )(常数时间)。 这是因为哈希表通过哈希函数将键映射到桶(bucket),平均情况下每个桶的元素很少,操作接近常数时间。 最坏情况: 插入、查找、删除:( O(n) ),其中 ( n ) 是容器中元素数量。 最坏情况发生在哈希冲突严重时,例如所有键都映射到同一个桶,导致桶内元素形成长链表或类似结构。 导致 ( O(n) ) 的情况 哈希函数质量差:如果哈希函数将大量键映射到同一桶,冲突增加,桶内查找退化为线性搜索。 高负载因子:负载因子(load_factor = 元素数 / 桶数)过高,导致更多冲突。C++ 默认最大负载因子为 1.0,当超过时会触发...
vector与array
vector 与 array 的区别以下是 C++ 中 std::vector 和 std::array 的区别,涵盖定义、特点、性能和使用场景等方面。 1. 定义 **std::vector**: 动态数组,来自 <vector> 头文件。 可以在运行时动态调整大小,支持插入、删除元素。 基于堆内存分配,容量不足时自动扩容。 **std::array**: 固定大小数组,来自 <array> 头文件(C++11 引入)。 封装了 C 风格数组,长度在编译时确定,无法动态改变。 通常分配在栈上(或静态存储区)。 2. 主要区别 特性 std::vector std::array 大小 动态大小,可通过 resize、push_back 等调整 固定大小,编译时确定 内存分配 堆内存,动态分配 栈内存(通常)或静态存储区 性能 访问速度快,但扩容/重新分配有开销 访问速度快,无动态分配开销 容量管理 支持 capacity 和 reserve,可预分配空间 无容量概念,大小固定 接口 丰富(如...
操作系统中的调度算法
操作系统中的调度算法操作系统中的调度算法用于决定进程或线程的执行顺序,以优化 CPU 利用率、吞吐量、响应时间等。以下是常见的调度算法,分为非抢占式和抢占式两类: 1. 非抢占式调度算法进程一旦获得 CPU,将运行至完成或主动让出 CPU。 先来先服务(First-Come, First-Served, FCFS): 按进程到达顺序执行。 优点:简单,易实现。 缺点:可能导致“短进程等待长进程”问题(护送效应),平均等待时间长。 时间复杂度:队列操作 ( O(1) )。 短作业优先(Shortest Job First, SJF): 选择预计运行时间最短的进程优先执行。 优点:最小化平均等待时间(理论上最优)。 缺点:需预知运行时间,难以实现;长进程可能饥饿。 时间复杂度:选择最短进程 ( O(n) ),可用优先队列优化。 优先级调度(Priority Scheduling): 根据进程优先级调度,优先级高的先执行。 优点:支持重要进程优先。 缺点:低优先级进程可能饥饿。 时间复杂度:取决于优先级队列实现,通常 ( O(\log n) )。 2....