- 博客(112)
- 资源 (1)
- 收藏
- 关注
原创 C++ 中 std::thread 详细使用方法、注意事项及线程实现原理
本文详细介绍了C++17中std::thread的使用方法和注意事项。主要内容包括:线程的创建方式(函数、lambda、函数对象)、参数传递规则(值传递需用std::ref包装引用)、生命周期管理(必须调用join或detach)、线程状态检查(joinable)以及移动语义支持。重点强调了避免数据竞争、异常安全和资源管理的注意事项,并分析了std::thread的底层实现原理(1:1线程模型)和内存模型机制。最后给出了多线程编程的最佳实践建议,如优先使用join、合理使用同步机制等,帮助开发者编写安全高效
2025-10-26 13:24:10
1097
原创 C++ 17 20 中的线程类说明
摘要: C++17和C++20在多线程编程中引入了多项增强功能,包括std::jthread(自动线程管理)、std::shared_mutex(读写锁)以及更完善的原子操作支持。核心类如std::thread、std::mutex、std::atomic和std::future分别用于线程创建、同步、无锁数据访问和异步操作。新特性如协作式中断(std::stop_token)提升了线程控制的灵活性。使用时需注意资源管理(避免未join的线程)、死锁预防、内存序选择及异常安全。示例代码展示了线程创建、读写锁
2025-10-26 13:10:25
931
原创 C++ regex 详细说明(一)
类名用途std::regex表示一个正则表达式对象存储匹配结果(sc判断整个字符串是否完全匹配在字符串中搜索匹配的子串替换匹配的部分项目建议✅ 使用场景文本验证、日志分析、数据提取、字符串清洗✅ 推荐做法复用regex对象、使用R"()"原始字符串、加const❌ 避免频繁构造、复杂正则用于高频场景、忽略异常🔍 调试技巧用在线正则测试工具(如 regex101.com)先验证模式C++ 的<regex>库功能强大,虽然性能不如专用库(如 RE2),但对于大多数应用已足够。
2025-10-19 14:20:44
852
原创 C++ 中引用详细说明
引用是某个已存在变量的别名(alias),一旦引用被初始化为某个变量,它就“绑定”到该变量上,之后对引用的操作就等同于对该变量的操作。特性说明本质变量的别名,底层常通过指针实现优点安全、简洁、高效(避免拷贝)用途函数参数、返回值、循环遍历、运算符重载等限制必须初始化、不能为空、不能重新绑定最佳实践多用const引用传递大对象,避免悬空引用引用是 C++ 中实现高效、安全编程的核心机制之一。理解其原理和使用场景,能让你写出更高效、更现代的 C++ 代码。
2025-10-19 14:08:30
668
原创 C++ 智能指针 (2)
原因解决方案循环引用使用打破循环自定义删除器错误确保删除器安全、不抛异常错误地从this创建shared_ptr使用管理非堆内存避免将智能指针用于栈对象逻辑错误导致所有权混乱正确理解unique_ptr的移动语义智能指针虽然强大,但仍需正确使用,否则仍可能导致资源泄漏或程序崩溃。
2025-10-07 10:12:22
606
原创 C++ 智能指针(1)
智能指针是现代C++(C++11及以上)中用于自动管理内存的核心工具,通过RAII原则将资源生命周期与对象绑定,确保资源自动释放。主要类型包括:unique_ptr(独占所有权,高效无开销)、shared_ptr(共享所有权,引用计数机制)和weak_ptr(弱引用,解决循环引用问题)。使用时应优先选择make_unique和make_shared,避免直接使用new,注意循环引用和所有权问题。智能指针能有效防止内存泄漏,简化内存管理,是现代C++开发的重要实践。
2025-10-07 10:07:52
544
原创 C++ 指针
指针是 C++ 的基石,它提供了直接操作内存的能力,带来了高效和灵活性。理解指针的核心概念——存储地址解引用指针算术以及动态内存管理——至关重要。然而,原始指针的使用需要极其谨慎,容易引发各种错误。因此,在现代 C++ 编程中,应优先考虑使用智能指针引用和标准库容器(如)来替代原始指针,以编写更安全、更易维护的代码。只有在确实需要底层控制或与 C 语言库交互时,才应谨慎使用原始指针。
2025-10-06 16:38:35
942
原创 C++ 编译原理
1. 预处理 g++ -E -std=c++11 hello.cpp -o hello.i # 2. 编译为汇编 g++ -S -std=c++11 hello.i -o hello.s # 3. 汇编为目标文件 g++ -c -std=c++11 hello.s -o hello.o # 4. 链接为可执行文件 g++ -std=c++11 hello.o -o hello。编译过程由编译器实现,而主流编译器(如 GCC、Clang)通过支持 C++11 标准来解析和生成符合该标准的代码。
2025-10-06 16:31:19
1145
原创 C++ 11和20中的位域使用说明-2
std::bitset是C++中处理固定大小位序列的模板类,适用于标志管理、权限控制等场景。支持从整数、字符串构造(C++20新增std::from_chars解析),提供位访问、设置/重置/翻转等操作,并可进行位运算。能转换为unsigned long/string等类型,超出范围会抛出异常。其类型安全、功能丰富、性能良好,常用于二进制数据处理、状态标志管理等场景。C++20增强了其解析能力和错误处理机制。
2025-10-03 11:40:55
300
原创 C++ 11和20中的位域使用说明-1
C++位域(BitFields)是一种特殊的结构体成员,允许精确控制变量所占用的比特数而非默认字节数。通过语法struct {数据类型 成员名:位数;}声明,常用于内存优化、硬件寄存器交互和状态标志管理。位域能有效压缩数据存储空间,如用16位表示日期(5位日+4位月+7位年)或用1位布尔值表示状态标志。但使用时需注意:不可取地址、存在平台依赖性、可能有性能损耗,且结构体实际大小可能因内存对齐而大于位域总和。在嵌入式系统等内存敏感场景中非常有用,但跨平台开发时需谨慎处理位序问题。
2025-10-03 11:17:19
911
原创 C++中 optional variant any 的使用
C++17引入的std::optional、std::variant和std::any是类型安全的容器类工具:optional表示可能缺失的值,替代特殊标记值;variant是类型安全的联合体,可存储多种指定类型之一;any支持任意类型但需类型转换。三者各有特点:optional性能较好,variant适合固定类型集合,any灵活性最高但性能开销大。建议优先使用optional和variant,慎用any以保持类型安全。这些工具减少了指针和void*的使用,提升了代码的安全性和表达力,是现代C++开发的重要
2025-09-27 13:45:48
2838
原创 C++常用迭代器操作函数
功能:在范围内查找第一个满足谓词(predicate)条件的元素。函数原型// 查找第一个偶数});if (it!std::cout << "找到偶数: " << *it << std::endl;} else {std::cout << "未找到偶数" << std::endl;return 0;函数用途是否修改容器常见用法find_if查找首个满足条件的元素否获取元素位置remove_if移动不满足条件的元素到前面是(逻辑)erase-remove 惯用法count_if。
2025-09-27 13:17:58
862
原创 C++ 中使用 iterator 中注意事项和优化技巧(2)
本文总结了C++迭代器的最佳使用实践:优先使用范围for循环(C++11)简化代码;对于只读访问使用const迭代器或cbegin()/cend();避免循环中重复调用end();用STL算法替代手动循环;根据场景选择正向/反向/随机访问遍历;使用引用避免大对象拷贝;利用C++20 ranges库实现函数式编程。关键原则包括:检查迭代器有效性、优先使用STL算法和自动类型推导、避免手动管理迭代器。这些技巧能提升代码安全性、性能和可读性,特别是在现代C++环境中。
2025-09-14 14:54:41
392
1
原创 C++ 中使用 iterator 中注意事项和优化技巧(1)
本文介绍了C++中使用迭代器的注意事项和优化技巧。重点包括:避免使用失效迭代器(容器修改后需重新获取)、正确在循环中执行erase操作(使用返回值更新迭代器)、避免有/无符号类型混用、不空容器解引用迭代器,以及不将end()视为固定地址。文章通过代码示例详细说明了常见错误及解决方案,并比较了不同容器的迭代器失效规则。掌握这些要点能有效避免运行时错误并提升程序性能。
2025-09-14 14:43:07
630
原创 C++中多线程core的问题分析和总结
实践说明1. 每个线程独立处理异常使用包裹线程函数主体2. 使用std::async或便于跨线程传递异常3. 避免裸抛异常裸线程不自动处理异常4. 使用 RAII 管理资源如,防止异常导致死锁5. 主线程join()所有线程防止主线程提前退出导致未定义行为。
2025-09-14 14:09:02
630
原创 C++ 17中的初始化那些事
《C++17初始化详解》摘要:C++17通过统一初始化语法和聚合初始化的改进,显著增强了变量、结构体和类的初始化能力。文章详细介绍了基本变量初始化推荐使用{}防止窄化转换,结构体支持聚合初始化与结构化绑定,类初始化需区分有无构造函数,以及STL容器的统一初始化方式。特别强调了避免"最令人烦恼的解析"等常见陷阱,并提供了包括基本类型、数组、容器在内的完整示例,推荐优先使用{}列表初始化和结构化绑定来提高代码安全性与可读性。
2025-09-07 10:33:31
931
原创 C++设计模式 原型模式
原型模式是一种创建型设计模式,它使用一个现有的对象实例作为原型,并通过复制该原型来创建新的对象实例。这种方法避免了每次都需要重新创建复杂对象的问题。或其派生类包含指针或其他需要深度复制的数据结构,则需要在。类,它代表几何形状,并且可以被复制。方法使用了浅复制(shallow copy)。方法中实现相应的深复制逻辑。方法来克隆这些对象。请注意,这个示例中的。
2024-10-13 20:33:24
615
原创 c++编写java模式的线程类
的默认析构函数会确保如果线程尚未结束,它会被正确地 join。标准库来创建和管理线程。然而,C++ 不像 Java 那样提供一个内置的。需要注意的是,C++11 不支持在构造函数中调用虚函数,所以我们使用了。类,而是提供了一个更底层的 API。类型的函数对象作为构造参数,这个函数对象将被用来创建并启动线程。的类,它将允许用户通过继承来重载。在 C++11 中,我们可以使用。方法是虚函数,子类可以通过继承。指针,从而允许在构造时传递给。类功能的 C++11 实现。方法来定义线程的行为。成员函数来启动线程。
2024-08-04 19:53:17
300
原创 c++编写生产者消费者模型
这样,当队列已满时,生产者线程将会阻塞,等待消费者线程消费数据以腾出空间。同样,当队列为空时,消费者线程也会阻塞,等待生产者线程填入数据。
2024-08-04 19:49:42
325
原创 使用C++编写TCP服务端程序
要使用Boost.Asio库来开发一个TCP服务端程序,你需要遵循以下步骤。下面的示例代码将演示如何创建一个简单的异步TCP服务器,它能够接收客户端连接,并异步处理请求和响应。首先,确保你已经安装了Boost库,并在你的项目中包含了。
2024-07-08 09:58:19
624
原创 JAVA中的lambda使用
当你在Java中使用Lambda表达式时,你可以更简洁地定义一个匿名函数。Lambda表达式可以用来代替某些接口类型的对象,通常是函数式接口,而不需要单独实现接口的方法。是一个接受两个整数参数并返回它们之和的Lambda表达式。接口定义了一个接受两个整数参数并返回一个整数结果的方法。的实例,分别实现了加法和减法的功能。然后,通过Lambda表达式创建了两个。方法中调用这些实例来执行相应的操作。
2024-04-09 11:42:34
271
原创 JAVA中@FunctionalInterface 注解使用
是Java 8引入的一个注解,用于标记一个接口为函数式接口。函数式接口是指只有一个抽象方法(除了Object类中的默认方法如equals、hashCode等)的接口。在Java 8及以后版本中,函数式接口可以与lambda表达式配合使用。,它的目的是提供一个没有参数,但返回值类型为T的方法实现。接口的lambda表达式。
2024-04-09 11:09:10
452
原创 Java中的内部类
在Java中,内部类(Inner Class)是指在一个类的内部定义的另一个类。在上述示例中,内部类的设计提高了代码的封装性和灵活性,使得类与类之间的关系更加紧密,同时也增加了代码的复杂度,应当根据实际情况权衡是否使用内部类。匿名内部类是没有名字的内部类,通常用于简化单次使用的类的创建过程,常用于事件监听、适配器等场景。局部内部类是在方法或者代码块内部定义的类,它的作用域只限于所在的方法或代码块。
2024-04-02 14:07:44
718
原创 Java中的原型模式
方法时,将创建一个原始对象的副本,这样修改克隆对象的属性不会影响到原始对象。注意在实现深克隆时,需要确保对象的所有属性也都进行适当的深度复制,例如在本例中,日期对象进行了克隆以防止浅克隆带来的数据共享问题。Java中的原型模式是一种创建型设计模式,它通过复制已有对象来创建新的对象,而不是每次都创建一个新的实例。这个模式适用于那些创建新对象的成本较大或者需要保持对象属性一致性的场景。在Java中,通常通过实现。接口,这意味着它可以被克隆。方法来实现原型模式。
2024-04-02 11:05:55
678
原创 Java中的装饰器模式
在Java中,装饰器模式允许我们动态地给对象添加新的行为或责任,而无需修改原有类。以下是一个简单的装饰器模式示例,我们将模拟一个咖啡销售系统,其中基础饮料类(Component)是Coffee,装饰器类(Decorator)用来添加额外的调料。运行上述代码后,将会输出每种咖啡的描述和对应的价格,展示了如何通过装饰器模式动态地添加不同的调料并计算总成本。
2024-04-02 10:24:04
800
原创 Node.js常用命令
Node.js本身提供了一些核心命令行工具,而围绕Node.js生态,最常用的是与其包管理器npm相关的命令。以上列举的是Node.js和npm的部分常用命令,实际上还有很多其他命令和子命令,具体使用时请参照官方文档以获得完整和最新的信息。打开Node.js的交互式解释器环境,可以在此环境中编写和立即执行JavaScript代码。安装指定的Node.js模块到当前项目,并写入。显示当前项目所有已安装的模块及其版本。在npm注册表中搜索包含关键字的模块。输出当前安装的Node.js版本。获取特定配置项的值。
2024-04-01 13:28:40
1040
原创 npm常用命令详解
文件,该文件包含了项目的基本信息,比如名称、版本、作者、描述、入口文件、依赖关系等。以上就是npm一些基本且常用的命令,npm的功能非常丰富,还有更多高级选项和功能可以根据实际需求查阅官方文档或相关教程。这个命令会启动一个交互式的向导,帮助你在项目根目录下创建一个。这两个命令都会显示您当前安装的npm的版本。安装指定的模块到当前项目的。部分(生产环境依赖)在。
2024-04-01 11:57:29
922
原创 MySql的下载与安装
这样就完成了在CentOS 7系统中MySQL 8.0的基本下载和安装流程。请注意,由于MySQL版本更新和策略变化,具体的安装命令和过程可能会有所变动,建议在安装时参照官方最新文档进行操作。请根据实际情况和实际安装界面提示操作,以上步骤可能会因MySQL发行版本的不同而有所差异。在安装过程中,请留意具体的提示信息,按照官方文档或安装向导的指引来完成安装和配置工作。: 添加MySQL官方的Yum源以便直接通过yum命令安装MySQL 8.0。: 首先,登录到您的CentOS 7服务器并打开终端。
2024-03-31 08:00:04
1152
原创 Spring OAuth2 Resource Server 配置
Spring OAuth2 Resource Server 是 Spring Security 中的一个模块,用于保护资源服务器上的API资源,确保只有持有合法访问令牌(access token)的客户端才能访问受保护的资源。
2024-03-29 15:29:42
3253
1
原创 Java 中的 Flux 类
这段代码首先创建了一个包含数字1到5的Flux,然后将每个元素转换为字符串,接着过滤出偶数,每发出一个元素就立即打印出来,并为每个元素设置了100毫秒的延迟。最后订阅了这个Flux,使得处理流程得以启动。类是 Reactive Streams 规范在 Reactor 库中的实现,用于处理包含零个、一个或多个元素的异步序列。是一种响应式流类型,适用于处理连续的数据流,例如网络请求、数据库查询结果集、事件流等。
2024-03-28 15:06:32
6096
1
原创 Java中的Mono类
类是Spring Reactor框架中的一个核心组件,它是Reactive Streams规范的一个实现,主要用于处理包含零个或一个元素的异步序列。Mono可以代表未来某个时刻可能出现的单一值,或者表示没有值(即空值)。这种类型的反应式类型非常适合那些你期望返回单个结果(比如查询数据库得到的单个实体)的情况。注意:由于Mono是冷信号(Cold Signal),直到订阅发生时才会执行相关逻辑。因此,它的优势在于能够构建灵活且高效的异步处理管线。
2024-03-28 15:05:37
8129
1
原创 浏览器如何渲染页面
如果JavaScript修改了DOM结构或CSS样式,或者有其他交互导致页面变化,浏览器会重新执行部分或全部上述步骤(如布局、绘制等)以反映新的状态。浏览器将DOM树与CSSOM树结合,形成渲染树(Render Tree),它包含了每个可见节点的样式信息。通过这个例子可以看出,浏览器渲染页面是一个有序且相互关联的过程,涉及网络通信、文档解析、样式计算、布局以及最终的图形绘制等多个环节。属性,浏览器将在文档解析完成后,DOMContentLoaded事件触发前,执行JavaScript代码(在此例中为。
2024-03-26 15:35:56
408
原创 浏览器事件循环原理
由于setTimeout的延时时间为0,虽然它已经注册,但在实际应用中,至少要等到本次事件循环的微任务队列执行完毕后才会执行(实际延时通常大于0,这里是理想化表述)。5. 一旦宏任务执行完毕,主线程再次空闲,继续检查微任务队列,若有微任务则继续执行,否则继续等待新的宏任务到来,如此循环往复。- 创建一个Promise,并在其内部立即执行同步代码块,打印'2. 同步代码块内的微任务'- 清理并执行微任务队列中的所有微任务。- 执行宏任务队列中的下一个宏任务。- 执行微任务'4. 微任务'
2024-03-26 15:31:27
278
原创 JAVA中CAS原理
在Java中,CAS(Compare-and-Swap)是一种无锁算法,通过JNI(Java Native Interface)调用本地方法来利用处理器提供的原子指令实现。这意味着即使在高并发环境下,多个线程同时尝试更新同一变量时,只有一个线程能成功完成更新,其余线程将继续循环尝试直至成功,从而确保了在无锁的情况下也能实现并发控制和数据一致性。方法接受两个参数:当前预期的值和新的值。这个方法尝试将原子整数的值从预期的当前值更新为新值,如果当前原子整数的实际值与预期值相匹配,则更新,并返回。
2024-03-25 09:09:34
566
原创 进程通信(生成者-消费者)
同步块或方法中使用,因为它们依赖于对象的监视器(monitor),只有持有对象监视器的线程才能调用这些方法。下面是一个简单的例子,展示如何在一个生产者消费者模型中使用。方法的配合使用,实现了生产者和消费者线程之间的同步和通信。是用于线程间协作和同步的重要方法,它们都定义在。
2024-03-25 09:06:19
513
原创 线程间通信
在这个例子中,有两个线程分别扮演生产者和消费者的角色,共享一个资源。的代码逐步执行,但是如果每个线程间都孤立地运行,就会造资源浪。务,那么这些线程之间就需要互相协调,这个过程被称为线程的通信。线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定。线程的通信可以被定义为:当多个线程共同操作共享的资源时,线。程间通过某种方式互相告知自己的状态,以避免无效的资源争夺。方法是线程间通信和同步的核心机制,它们位于。方法,它会唤醒所有等待在该对象上的线程。方式的线程间通信使用对象的。通知、共享内存、管道。
2024-03-24 12:52:55
412
原创 无锁、偏向锁、轻量级锁和重量级锁
状态、偏向锁状态、轻量级锁状态和重量级锁状态,这些状态随着竞争。内置锁可以升级但不能降级,意味着偏向锁升级成轻量。自动获取锁,降低获取锁的代价。线程来竞争锁时,先用偏向锁,表示内置锁偏爱这个线程,这个线程要。偏向(独占)锁了,锁会升级为轻量级锁,两个线程公平竞争,哪个线。版本为了减少获得锁和释放锁所带来的性能消耗,引入了偏向锁和。偏向锁是指一段同步代码一直被同一个线程所访问,那么该线程会。当有两个线程开始竞争这个锁对象时,情况就发生变化了,不再是。重量级锁会让其他申请的线程之间进入阻塞,性能降低。
2024-03-24 12:36:53
544
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅