随笔分类 -  C++

摘要:本文面向希望把现有 C++ 库提供给 Java 使用的开发者。文章不依赖某个具体业务,重点解释 Java、JNI、SWIG、C++ 适配层之间的关系,以及一套可以迁移到多数项目中的接口设计规则。 一、为什么需要 JNI 和 SWIG Java 代码运行在 JVM 中,C++ 代码被编译为本机机器码, 阅读全文
posted @ 2026-09-16 21:17 BlackSnow 阅读(5) 评论(0) 推荐(0)
摘要:在 C++ 多线程开发中,使用 GDB 调试可以说是家常便饭。为了快速查看某个复杂对象的状态,我们经常会在断点处使用 call 或 p(print)命令去主动调用类内部的成员函数。 但这在并发场景下往往会暗藏杀机。今天在调试一个使用了 boost::unordered::concurrent_nod 阅读全文
posted @ 2026-05-24 17:06 BlackSnow 阅读(40) 评论(0) 推荐(0)
摘要:FUN2.h // // Created by Administrator on 2026/3/23. // #ifndef CMD_FUN2_H #define CMD_FUN2_H #include <stdio.h> class FUN2 { public: int testFun2(); } 阅读全文
posted @ 2026-05-19 22:56 BlackSnow 阅读(12) 评论(0) 推荐(0)
摘要:9.1命令原型 nexti 执行下一行的源代码中的一条汇编指令 9.2 使用样例 查看汇编 (gdb) disassemble Dump of assembler code for function main(int, char**): 0x000055555555543b <+0>: endbr6 阅读全文
posted @ 2026-05-19 22:51 BlackSnow 阅读(12) 评论(0) 推荐(0)
摘要:8.1 run 命令含义 run [arglist] 运行您的程序(如果指定了arglist,则将arglist作为参数运行程序) 8.2 关于程序的入参 wangguangbo@DESKTOP-O5D0MDL:/mnt/d/CMD$ gdb -q --args ./cmd 123 abc "1 b 阅读全文
posted @ 2026-05-19 22:51 BlackSnow 阅读(23) 评论(0) 推荐(0)
摘要:7.1 disable<断点编号>(禁用断点(保留但不触发)) (gdb) disable 6 (gdb) i b Num Type Disp Enb Address What 4 breakpoint keep y 0x0000555555555458 in main(int, char**) a 阅读全文
posted @ 2026-05-19 22:50 BlackSnow 阅读(20) 评论(0) 推荐(0)
摘要:6.1 delete<断点编号>(删除指定断点) (gdb) i b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000001597 in main(int, char**) at main.cpp:46 2 breakpo 阅读全文
posted @ 2026-05-19 22:48 BlackSnow 阅读(14) 评论(0) 推荐(0)
摘要:5.1 info breakpoints(查看所有断点信息) (gdb) i b Num Type Disp Enb Address What 4 breakpoint keep y 0x0000555555555458 in main(int, char**) at main.cpp:36 5 b 阅读全文
posted @ 2026-05-19 22:48 BlackSnow 阅读(13) 评论(0) 推荐(0)
摘要:4.1 rb<模糊函数名> (gdb) rb testFun Breakpoint 1 at 0x1aa8: file FUN2.cpp, line 8. int FUN2::testFun2(); Breakpoint 2 at 0x17ac: file main.cpp, line 12. vo 阅读全文
posted @ 2026-05-19 22:47 BlackSnow 阅读(9) 评论(0) 推荐(0)
摘要:线程池 前言 我相信,已经阅读到这里的各位,不会对“线程池”这个词感到陌生。大部分开发者早就自己使用、学习,乃至实现过线程池。那不如我们先来进行一下基础的名词解释。 什么叫线程池? “线程”没什么好说的,是 CPU 调度的最小单位,也是操作系统的一种抽象资源。 “池”?水池装着水,线程池则是装着线程 阅读全文
posted @ 2026-05-17 15:09 BlackSnow 阅读(21) 评论(0) 推荐(0)
摘要:前言 和之前一样的,我们以 MSVC STL 的实现进行讲解。 std::future,即未来体,是用来管理一个共享状态的类模板,用于等待关联任务的完成并获取其返回值。它自身不包含状态,需要通过如 std::async 之类的函数进行初始化。std::async 函数模板返回一个已经初始化且具有共享 阅读全文
posted @ 2026-05-17 15:08 BlackSnow 阅读(13) 评论(0) 推荐(0)
摘要:std::scoped_lock 的源码实现与解析 本单章专门介绍标准库在 C++17 引入的类模板 std::scoped_lock 的实现,让你对它再无疑问。 这会涉及到不少的模板技术,这没办法,就如同我们先前聊 std::thread 的构造与源码分析最后说的:“不会模板,你阅读标准库源码,是 阅读全文
posted @ 2026-05-17 15:07 BlackSnow 阅读(16) 评论(0) 推荐(0)
摘要:std::thread 的构造-源码解析 我们这单章是为了专门解释一下 C++11 引入的 std::thread 是如何构造的,是如何创建线程传递参数的,让你彻底了解这个类。 我们以 MSVC 实现的 std::thread 代码进行讲解,MSVC STL 很早之前就不支持 C++11 了,它的实 阅读全文
posted @ 2026-05-17 14:39 BlackSnow 阅读(23) 评论(0) 推荐(0)
摘要:协程 前言 既然是“现代” C++ 并发编程教程,怎么能不聊协程呢? C++20 引入了协程语法,新增了三个用作协程的关键字:co_await、co_yield、co_return。但并未给出标准协程库,协程库在 C++23 被引入。 希望您拥有 gcc14、clang19,Visual Studi 阅读全文
posted @ 2026-05-17 14:37 BlackSnow 阅读(29) 评论(0) 推荐(0)
摘要:内存模型与原子操作 内存模型定义了多线程程序中,读写操作如何在不同线程之间可见,以及这些操作在何种顺序下执行。内存模型确保程序的行为在并发环境下是可预测的。 原子操作即不可分割的操作。系统的所有线程,不可能观察到原子操作完成了一半。 最基础的概念就是如此,这里不再过多赘述,后续还会详细展开内存模型的 阅读全文
posted @ 2026-05-17 14:33 BlackSnow 阅读(22) 评论(0) 推荐(0)
摘要:同步操作 "同步操作"是指在计算机科学和信息技术中的一种操作方式,其中不同的任务或操作按顺序执行,一个操作完成后才能开始下一个操作。在多线程编程中,各个任务通常需要通过同步设施进行相互协调和等待,以确保数据的一致性和正确性。 本章的主要内容有: 条件变量 std::future 等待异步任务 在规定 阅读全文
posted @ 2026-05-17 14:32 BlackSnow 阅读(24) 评论(0) 推荐(0)
摘要:共享数据 本章节主要内容: 多线程共享数据的问题 使用互斥量保护共享数据 保护共享数据的其它方案 有关线程安全的其它问题 在上一章内容,我们对于线程的基本使用和管理,可以说已经比较了解了,甚至深入阅读了部分的 std::thread 源码。所以如果你好好学习了上一章,本章也完全不用担心。 我们本章, 阅读全文
posted @ 2026-05-17 14:30 BlackSnow 阅读(25) 评论(0) 推荐(0)
摘要:使用线程 在标准 C++ 中,std::thread 可以指代线程,本章中,使用线程也就是代表使用 std::thread (C++20 std::jthread)。 本章围绕着它们来讲解。 Hello World 在我们初学 C++ 的时候应该都写过这样一段代码: #include <iostre 阅读全文
posted @ 2026-05-17 14:30 BlackSnow 阅读(16) 评论(0) 推荐(0)
摘要:基本概念 前言 在我们谈起“并发编程”,其实可以直接简单理解为“多线程编程”,我知道你或许有疑问:“那多进程呢?” C++ 语言层面没有进程的概念,并发支持库也不涉及多进程,所以在本教程中,不用在意。 我们主要使用标准 C++ 进行教学,也会稍微涉及一些其它库。 并发 并发,指两个或两个以上的独立活 阅读全文
posted @ 2026-05-17 14:27 BlackSnow 阅读(16) 评论(0) 推荐(0)
摘要:0.1 GDB 安装 1. Linux 系统 大多数 Linux 发行版都可以通过包管理器直接安装: Ubuntu/Debian 系列: sudo apt update sudo apt install gdb -y Fedora/RHEL 系列: sudo dnf install gdb -y # 阅读全文
posted @ 2026-04-07 21:20 BlackSnow 阅读(84) 评论(0) 推荐(0)