自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(119)
  • 收藏
  • 关注

原创 如何在VS里使用MySQL提供的mysql Connector/C++的debug版本

编译链接阶段:通过VC++ 目录 → 库目录(或链接器附加库目录)指定导入库(.lib)的目录。运行阶段:通过复制.dll到.exe目录、添加环境变量Path等方式让系统找到.dll。这两步缺一不可,否则会出现“链接错误(找不到.lib)”或“运行时错误(找不到.dll)”。在 Visual Studio 中配置动态库或静态库时,链接器的“附加依赖项”是告诉链接器“需要链接哪些具体库文件”的关键设置,其核心作用是明确指定项目依赖的库文件名,确保编译后的目标文件能与库文件正确关联,最终生成可执行程序。

2025-08-13 17:54:20 1011

原创 在Debian上安装MySQL

先参考的如果不行再试试我的方法下面是我遇到的情况先安装wget,dpkg,gunpg。然后进入MySQL官网下载主页社区版下载再是如图我是懒得改,直接抄的前面博主的指令接下来继续安装mysql服务器这是我遇到的问题我问AI回答说这个错误提示说明安装需要依赖包,但当前系统中没有安装。解决方法很简单,先安装即可等待一段时间mysql安装,然后会弹出这样的界面AI回答这是配置。

2025-08-11 15:15:30 1072

原创 如何在VS code里使用SQLtool连接上WSL上的MySQL服务

配置文件的核心作用是限制 MySQL 仅本地访问,需修改才能允许远程连接。其他配置(如portsocket)可根据需求启用,性能调优项需结合实际业务场景调整。修改后,再配合正确的用户权限、密码,即可解决 VS Code 连接被拒绝的问题。

2025-07-23 17:23:27 1005

原创 解决问题七大步骤

问题拆解与记录用文字描述:① 问题具体现象(如“Obsidian插件安装后崩溃”“Python代码运行时报TypeError”);② 复现步骤(按什么操作顺序触发,是否100%复现);③ 环境信息(设备型号、系统版本、软件版本、相关配置,如“Windows 11 + Obsidian 1.5.3 + Vimrc Support 0.4.2”);④ 错误日志/截图(保留弹窗提示、控制台报错信息,如“Plugin failed to load: Error: Module not found”)。

2025-07-19 23:33:07 894

原创 MySQL中的常见函数

【代码】MySQL中的常见函数。

2025-07-16 18:30:49 313

原创 并发数据结构设计

这段文字的逻辑链条是:从“线程安全是基础”,到“真正的并发需要突破互斥锁的序列化限制”,再到“通过缩小保护范围提升并发潜力”——本质上是在强调:并发数据结构的设计不仅要“安全”,更要“高效地支持并发”。这段内容进一步细化了“并发数据结构设计”的核心要点,聚焦于“如何在保证线程安全的基础上,实现高效的并发访问”,并明确了本章的讨论范围。这段内容的核心是:设计并发数据结构需兼顾“安全”与“高效并发”。安全依赖于维护不变式、避免竞态、明确用户约束;

2025-07-16 16:28:09 838

原创 std::mutex内部实现和内存序关系

原子操作的内存序(如)不仅能同步原子变量本身,还能通过happens-before关系为非原子操作提供顺序保证。自旋锁等同步原语正是利用这一特性,通过对内部原子变量的操作,确保受保护的非原子数据在多线程间的可见性和一致性。理解这一底层机制是正确使用C++并发编程的关键。在C++中,锁(Lock)是实现线程同步的核心工具。不同类型的锁针对不同场景优化,其底层实现依赖原子操作(如)和操作系统的同步原语(如系统调用)。C++的各种锁通过原子操作(如)和系统调用(如条件变量)实现,其核心区别在于锁的持有策略和。

2025-07-16 16:05:00 727

原创 内存栅栏(std::atomic_thread_fence)

在多线程编程中,CPU和编译器为了优化性能,可能会对内存操作(加载/存储)进行重排序。这种重排序在单线程中不会有问题,但在多线程环境下可能导致数据竞争(Data Race)或逻辑错误——例如,线程A的操作顺序在代码中是“写x→写y”,但实际执行可能被重排为“写y→写x”,而线程B可能因这种重排读取到错误的中间状态。内存栅栏(std::atomic_thread_fence)是C++提供的一种同步原语,它不直接操作数据,而是通过限制内存操作的重排序。

2025-07-15 18:08:45 1188

原创 Vim库函数

Vim 的库函数在命令模式中非常实用,可通过。

2025-07-14 21:20:11 624

原创 多线程是如何保证数据一致和MESI缓存一致性协议

线程间的内存序约束:通过release和acquire操作建立关系;内存屏障:在关键操作前后插入屏障,禁止指令重排序并触发缓存同步;缓存一致性协议:硬件层面保证缓存数据在核心间的同步。这些机制共同确保:当一个线程执行release后,另一个线程执行对应的acquire时,能看到release之前的所有操作结果,从而实现线程间的同步。物理单核计算机没有多核的缓存一致性机制(如MESI),但仍需要软件同步机制(如原子操作)来约束重排序和可见性。

2025-07-14 18:58:55 912

原创 Vim的magic模式

Magic 模式是 Vim 正则表达式的核心机制,通过控制特殊字符的解析方式,让你在简洁性和精确性之间选择。掌握。

2025-07-12 16:05:19 727

原创 synchronizes-with(同步与)和happens-before(先行发生)

的适用场景适合简单标志(如“就绪/未就绪”),通过内存序保证操作顺序,避免数据竞争。但轮询式等待效率较低,适合标志变化频繁、响应时间要求高的场景。核心内存模型保证原子操作通过和关系,确保非原子变量的跨线程访问安全,即使变量本身不具备原子性。与条件变量的对比原子变量的优势是轻量(用户态操作),但不适合长时间等待;条件变量通过内核阻塞实现高效等待,适合复杂条件或长时间等待的场景。原子操作不仅保证自身的原子性,更通过内存序控制其他操作的可见性和顺序性。

2025-07-12 08:43:42 1069

原创 MySQL 的语言体系

定义和管理数据库对象(表、视图、索引等)的结构。

2025-07-11 14:35:50 509

原创 用户自定义类型原子封装和原子操作的非成员函数接口

这段内容详细介绍了C++中如何为用户自定义类型(UDT,User-Defined Type)创建原子变体,包括其使用限制、行为特性及适用场景。作为原子类型的扩展,允许对自定义类型进行线程安全的原子操作,但受限于类型本身的特性,需满足严格的条件。类型必须有平凡的拷贝赋值,无虚函数/虚基类;比较交换操作基于memcmp(按位比较),可能与逻辑比较不一致;复杂类型更适合用互斥锁保护。理解这些限制有助于正确选择并发保护机制:简单UDT用提升性能,复杂类型用互斥锁保证安全性。非成员函数接口。

2025-07-11 08:30:44 849

原创 Qt项目锻炼——TODO(五)

在使用 SQLite 数据库时,数据库文件是一个包含数据库所有数据和结构的普通文件。SQLite 是一个嵌入式数据库,它不需要单独的服务器进程,所有的数据都存储在一个单一的磁盘文件中。

2025-07-10 12:00:20 1060

原创 内存存值和内存序(Memory Order)

内存存值:指数据在内存中的读写行为,多线程中需解决可见性和有序性问题。内存序:通过约束编译器和CPU的行为,保证多线程中内存操作的可见性和顺序性。使用原则:优先用releaseacquire(平衡性能与正确性),简单场景用relaxed,严格全局顺序用seq_cst。避免过度使用强序(如seq_cst),否则可能损失性能。比较-交换操作是原子编程的核心,和的选择需权衡硬件支持、操作复杂度和性能需求简单场景(如标志位)用weak+循环,兼顾性能;复杂计算场景用strong,避免重复计算;

2025-07-10 09:16:27 1209

原创 C++原子类型操作与内存序

类型必须是(即有平凡拷贝构造/赋值、析构函数)load()store()exchange()示例int x, y;// 满足Trivially Copyable提供轻量级同步:通过硬件指令避免锁的开销精确控制内存序:在性能和正确性间取得平衡支持用户自定义类型:扩展原子操作的应用范围理解原子操作的接口设计和内存序语义,是编写高性能并发代码的关键。在实际应用中,应优先使用模板特化,并根据场景选择合适的内存序,避免不必要的同步开销。操作类型核心函数典型应用场景存储/加载store()

2025-07-07 19:40:49 1031

原创 【无标题】Qt项目锻炼--TODO清单(四)

界面设计添加优先级筛选下拉框添加完成状态和逾期状态复选框添加日期范围选择器添加搜索框和搜索按钮数据模型增强在TaskModel中添加过滤条件存储变量实现组合过滤逻辑的方法为不同条件添加单独的设置方法交互逻辑将筛选控件的变化连接到过滤方法实现即时过滤或点击应用按钮后过滤优化表格显示,包括数据格式化和样式设置这个实现支持多条件组合筛选,用户可以根据优先级、完成状态、日期范围进行筛选,同时可以通过搜索框对标题和描述进行全文搜索。筛选条件之间是AND关系,可以灵活组合使用。

2025-07-06 10:22:33 677

原创 std::latch和std::barrier

若需求是“等待N个事件完成后继续”,选择Latch(一次性,简单);若需求是“多线程分阶段同步,每阶段都需要全体到达”,选择Barrier(可复用,复杂协调)。两者本质区别在于:Latch是“事件计数的终点”,Barrier是“线程执行的里程碑”。理解这些同步原语的核心特性,能帮助开发者在并发编程中更精准地控制线程协作,避免死锁和性能损耗。

2025-07-06 09:24:51 644

原创 Qt项目锻炼——TODO清单(三)

为什么成员变量不使用智能指针,因为Qt有自己的一套资源回收机制,通过指定父窗口实现当父窗口销毁时,子窗口一同销毁。

2025-07-05 22:44:22 237

原创 Qt项目锻炼——TODO清单(二)

Qt里有很多类和函数我也不知道,只能利用好Qt Assistant当场查找。TaskModel 类继承自 QSqlTableModel,用于处理与数据库中任务表的交互,以及对任务数据的显示和操作。头文件源文件补充 是 Qt 框架中用于数据库操作的模型类,它继承自 ,专为表格数据与 SQL 数据库之间的交互设计。以下是它与普通 (或其子类)的主要区别及使用方法:数据来源数据操作性能同步机制2. 编辑策略控制数据何时提交到数据库:4. 过滤与排序5. 高级用法自定义数据显示:重写 方法,

2025-07-05 22:17:20 1078

原创 Qt项目锻炼——TODO清单(一)

这是我Github项目的网址。

2025-07-05 17:17:22 956

原创 std::experimental::future和延续链

延续链是 C++ 异步编程的核心机制,它通过链式调用将多个异步任务串联起来,实现了非阻塞、高可读性的异步代码。从实验性的到 C++20 标准化的,延续机制不断完善,成为处理异步操作依赖关系的首选方案。在网络请求、数据处理、并行计算等场景中,延续链能显著提升代码的可维护性和执行效率。一次性等待:避免逐个等待future的开销非阻塞调度:仅在所有任务完成时触发回调,释放线程资源异常统一处理:集中处理所有任务的异常情况在处理大规模可并行数据时,结合when_all。

2025-07-05 16:07:01 851

原创 设计模式(十)

在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。也就是说,享元模式Flyweight执行时所需的状态是有内部的也可能有外部的,内部状态存储于ConcreteFlyweight对象之中,而外部对象则应该考虑由客户端对象存储或计算,当调用Flyweight对象的操作时,将该状态传递给它。还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

2025-07-04 22:25:02 872

原创 基于消息传递的并发模型

下面是一个使用 C++ 实现的简化版 Actor 模型示例,包含消息系统、Actor 基类和具体的 ATM 系统实现。这个示例展示了如何通过消息传递实现无锁并发编程。我们不断往消息队列插入任务,然后线程池里的线程去竞争完成这些任务。但消息队列为空时,这些队列就会被挂起,直到条件变量通知。这个示例展示了 Actor 模型如何简化复杂的并发系统设计,通过消息传递和状态机实现清晰、安全的交互逻辑。

2025-07-04 20:24:06 878

原创 设计模式(九)

职责链模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求。这些对象连接成一条链,请求沿着链传递,直到有一个对象处理它为止。职责链模式通过将请求处理者组织成链,实现了请求发送者与接收者的解耦,使系统更具灵活性和可维护性。在需要动态处理请求或多级处理的场景中,该模式尤为适用。来封装一系列对象间的交互,使各对象无需显式引用彼此,从而降低耦合度。中介者负责协调对象间的通信,所有交互都通过中介者进行,而非对象直接调用。中介者模式通过引入中介对象,将复杂的对象间交互集中管理,降低了系统耦合度,提高了可维护性。

2025-07-03 22:53:09 1063

原创 基于多线程实现链表快排

splice和partitionsplice通过节点迁移实现链表的高效重组,是链表特有的性能优化手段partition提供通用的序列分割能力,配合splice可实现链表上的高效分治算法(如快速排序)两者结合使用时,能在避免元素复制的同时完成复杂的数据处理任务,尤其适合对性能敏感的链表操作场景。splice是std::list最强大的特性之一,通过指针操作实现了元素的零拷贝转移。O(1) 时间复杂度:远优于复制或移动元素内存高效:无需额外空间存储临时元素迭代器稳定性:转移后迭代器仍然有效。

2025-07-03 16:36:36 880

原创 设计模式(八)

在需要处理多维度变化的场景中,桥接模式是一种优雅的解决方案,它能有效避免继承导致的类爆炸问题,让代码结构更加清晰。这里的“抽象”指的是高层逻辑(如业务接口),“实现”指的是底层实现(如具体平台或算法)。通过组合而非继承,桥接模式避免了抽象与实现的紧耦合,支持两者独立扩展。命令模式(Command)​,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;:设计一个跨平台图形绘制系统,支持在不同操作系统(Windows、Linux)上绘制不同形状(圆形、矩形)。:保存对象状态,支持撤销/恢复。

2025-07-02 18:15:54 701

原创 C++异步编程里避免超时机制

C++的时钟系统通过和系统时钟:与现实时间同步,但可能非单调。稳定时钟:保证时间单调递增,适合测量时间间隔。高精度时钟:提供平台支持的最高精度。合理选择时钟类型是编写可靠时间敏感代码的关键,特别是在超时控制、性能分析和分布式系统同步等场景中。这段内容详细介绍了C++标准库中类型别名对应duration定义示例10ns100us1000msseconds10sminutes5minhours24h特点自动选择足够大的整数类型,支持表示超过500年的时间间隔。

2025-07-02 17:44:00 967

原创 设计模式(七)

实现一个简单的数组集合,并为其提供迭代器支持。

2025-07-01 21:41:50 1078

原创 std::future、std::promise、std::async 和 std::packaged_task涉及到的异常存储机制

组件角色异常处理方式手动控制共享状态通过显式设置封装可调用对象自动捕获任务执行中的异常std::async高层异步接口透明传递异步函数的异常结果/异常消费者通过get()重新抛出异常异常抛出 ───> 被捕获并存储到future的共享状态 ───> 调用future.get() ───> 重新抛出异常↑│ │ │自动捕获 显式调用set_exception() 未设置即销毁。

2025-07-01 18:12:22 903

原创 std::promise和std::future的使用示例——单线程多链接、多线程单链接

适用场景:当需要从一个线程获取另一个线程的执行结果时,使用比手动管理共享状态和条件变量更简洁安全。对比其他同步工具相比:无需手动管理互斥锁,专注于结果而非状态。相比std::async:更底层灵活,可自定义线程管理。未设置值的风险会永久阻塞,若promise被销毁则抛出异常。解决方案始终确保promise在销毁前设置值/异常。使用超时等待(wait_for)避免永久阻塞。通过异常处理捕获。的设计要求生产者(promise)与消费者(future。

2025-07-01 17:57:15 687

原创 设计模式(六)

备忘录模式是实现对象状态保存与恢复的优雅解决方案,通过分离状态管理职责,既保护了对象封装性,又提供了灵活的历史记录功能。该模式让客户端可以统一处理单个对象(叶子节点)和组合对象(容器节点),无需区分它们。透明方式是组合模式的典型实现,它通过牺牲一定的安全性来换取接口的一致性和客户端代码的简化。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。所有组件对外呈现相同的接口,符合“一致对待组合对象和叶子对象”的设计目标。

2025-06-30 16:16:22 816

原创 设计模式(五)

状态模式、策略模式和适配器模式

2025-06-29 17:32:15 979

原创 设计模式 (四)

一、核心概念抽象工厂模式是一种创建型设计模式,其核心思想是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它允许客户端通过抽象接口创建一组产品,而不必关心具体实现类。二、核心角色抽象工厂(Abstract Factory)定义创建一组产品的抽象方法(如具体工厂(Concrete Factory)实现抽象工厂的方法,创建具体产品的实例。抽象产品(Abstract Product)定义产品的接口或抽象类。具体产品(Concrete Product)实现抽象产品接口,由具体工厂创建。

2025-06-28 09:51:34 808

原创 设计模式(三)

当一个对象(被观察的对象,称为。

2025-06-27 10:27:52 1013

原创 设计模式(二)

一、迪米特法则(LoD)的核心定义迪米特法则(Law of Demeter, LoD),又称 “最少知识原则(Least Knowledge Principle)”,是面向对象设计的经典指导原则之一。一个对象应当尽可能少地与其他对象发生相互作用,只与 “直接的朋友” 通信,避免与 “陌生人” 产生直接交互。二、关键概念:“直接的朋友” 与 “陌生人”直接的朋友当前对象的成员变量(属性)所引用的对象;方法的参数所引用的对象;方法的返回值所引用的对象;方法内部创建的对象(部分场景下需谨慎判断)

2025-06-26 15:53:25 940

原创 设计模式(一)

简单工厂模式(Simple Factory Pattern)属于创建型设计模式,它通过一个工厂类决定创建哪一种产品类的实例,而不需要直接使用new运算符实例化对象。该模式将对象的创建逻辑封装在一个单独的类中,客户端只需知道所需产品的类型即可。

2025-06-22 18:51:39 449

原创 模板表达式(Expression Templates)实现复数加法延迟计算的完整代码

【代码】模板表达式(Expression Templates)实现复数加法延迟计算的完整代码。

2025-05-05 21:21:09 157

原创 代码分享–以红黑树实现Map和Set

【代码】【无标题】

2025-04-04 14:53:38 218

寻找字符串的公共前缀(prefix)

寻找字符串的公共前缀(prefix)

2024-10-07

寻找字符串的公共前缀(prefix)

寻找字符串的公共前缀(prefix)

2024-10-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除