- 博客(310)
- 资源 (20)
- 收藏
- 关注

原创 我的新书《C++服务器开发精髓》终于出版啦
一、千呼万唤始出来亲爱的各位读者,我的新书《C++ 服务器开发精髓》终于终于终于与大家见面了,图书如下:图书的封面设计很精美,当然内容一定不负众望。因出版社老师要求提供一张照片放到封面上,今年的6 月 1日儿童节去拍了一张,照片拍出来放在下面大家自己看吧。人到中年,生活不易,没有少年时代那种懵懂与青涩,多了一份厚实与坚定了。一些想做的事情却一步步把它做成了,成为现实。昔日戏言身后事,明朝都到眼前来。所以,梦想还是要有的,还是要坚持的,即使这世界有那么多不完善,生活有那么多不如意,因为万一..
2021-06-25 01:32:34
3712
原创 C/C++编程实战训练营
这是我根据自己学习C++网络编程以及工作十年在项目中设计网络通信框架的经验总结,为了照顾C/C++新手先解决C++工具问题,再逐步减少网络编程的基础API和网络模型,最后再到综合性整合性练习,每介绍一些基础知识,都会拿一些实际的项目去佐证(实战)。如果在面试时,感觉面试官的问题都回答上来了,或者感觉自己简历中项目挺好的,面试完回去等通知后,就再也没有“通知”了,可以看看这里:《通过了面试很开心,马上要和HR谈薪资了,但是报太高了失去了offer,报太低了,自己又觉得吃亏,可以看这里:《
2025-06-03 21:03:02
647
原创 C++17详解
C++11 是 C++ 语言的一次重大更新。它带来了许多现代特性,如 lambda 表达式、常量表达式(constexpr)、可变参数模板、多线程、基于范围的for循环、智能指针等强大元素,标志着该语言取得了巨大进步。之后的 C++14 是一次较小的更新,它改进了先前标准中的一些内容,并增加了一些小特性。虽然C++17不像C++11那样变化巨大,但它比 C++14 的改动更大,带来了许多令人激动的新增内容和改进。本书将带你逐一了解这些变化!
2025-05-19 14:07:16
593
原创 Go项目实战:用Go从零写一个编排器(类Kubernetes)
通过这个项目,你不仅能学到大型Go项目如何组织安排的,同时也能学到容器相关的技术,更不用说各种设计理念和开发技巧了。本专栏带领着大家使用Go语言从零一步一步地开发一个类似于Kubernetes的编排器。
2025-05-19 13:55:03
231
原创 Go实战项目推荐:用Golang从零实现一个解释器
如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。其详细目录如下。
2025-05-19 13:50:50
487
原创 Go实战项目推荐:使用Go从零开发一个编译器
如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。
2025-05-19 13:47:54
248
原创 C++游戏编程入门 教程
如果你连C++基础语法都不熟悉,并且想学习C++,或者想学习游戏开发,那么本专栏特别适合你。在这个教程中,我们将使用C++开发4个流行的小游戏。
2025-05-19 12:23:52
623
原创 Windows 10系统编程 说明
这应该是继《Windows核心编程》之后、最近十年最好且唯一的关于Windows编程的书吧,其涉及的内容涵盖Windows7到Window10程序的方方面面,非常详尽、通俗易懂。很多人觉得利用Windows API进行Windows原生编程已经日薄西山了,Windows系统不常用了,这其实是程序员的幸存者偏差,无论是工作还是娱乐,对于普罗大众来说,Windows系统仍然是最最常使用的操作系统,就像现在一些人已经不愁吃不愁穿了,会忽视水稻的重要性了。学习Windows编程的好处如下:在如今的求职大环境下,Wi
2025-05-07 22:15:27
554
原创 远程控制软件 gh0st 源码分析
相信很多人应该或多或少地听说过 gh0st 的大名,正如上面所说,它是一款远程控制软件,其原始版本的代码和作者已经无从考证,笔者手里这一份也来源于网络,我修正一些 bug 并作了一些优化,仅供个人学习研究,不可用于商业用途和任何非法用途,否则后果自负。
2025-05-07 22:06:34
614
原创 C++23快速入门
利用唯一指针(Unique Pointers)、共享指针(Shared Pointers)和弱指针(Weak Pointers)示例程序:使用std::unique_lock避免竞态条件(Race Condition)用未来对象(Futures)、承诺对象(Promises)和任务(Tasks)协调线程。示例程序:集成std::string和std::string_view。深入探究std::string和std::string_view。std::string与std::string_view的对比。
2025-05-07 21:56:13
901
原创 涵盖C++17和20,C++语法面试题.pdf 限时领取
我学习和使用 C/C++ 开发十多年了,目前在某大厂做 C++ 架构方面的工作,在学习 C/C++ 的过程中,我踩了一个又一个坑,深知新手学习 C/C++ 的重要性和存在的困难,面试工作经验要求和与通过工作获取经验往往是一对先有鸡先有蛋的矛盾体——你没有工作经验就没法获得工作,你不工作就没法获得工作经验。许多工作年限不长的 C/C++ 小伙伴在面试时,被面试官的各类的 C++ 语言题问得抓耳挠腮、怅然若失。C++单纯从语法层面来讲,就挺复杂的,而许多新人望而却步。关键字mutable的作用是什么?
2025-04-17 14:04:22
212
原创 关于小方~
大家好,我是张小方。玩知乎很久,做个自我介绍吧。🐶 工作十余年,地大师兄,在字节搬过砖,目前在某外企做架构。- 足够硬核,内容老狠了!- 备注来意。
2025-04-09 21:32:35
848
原创 明基RD280U显示器|大厂程序员都在用的生产力工具
工欲善其事必先利其器。明基的这款显示器体验了2周后,总结下来就是:相比之前得普通显示器,切切实实的解决了互联网公司程序员日常工作中的一些痛点,带来了极大的舒适度、效率提升和健康保护,是一项划算的投资。
2024-09-04 12:15:32
1503
原创 Mac机器上使用VM虚拟机安装win11连不上网,怎么解决
M用户使用VM虚拟机安装win11连不上网,怎么解决_vmware fusion 没有网络-CSDN博客VMware Fusion 配置网络适配器_vmware虚拟机苹果网络-CSDN博客
2024-05-10 20:18:11
2375
1
原创 cmake 编译时提示: Could NOT find OpenSSL
参考:cmake 编译时提示: Could NOT find OpenSSL | 要懂得舍得博客
2024-03-09 22:20:18
1025
原创 Visual Studio中文注释乱码两种解决方案
在公司多人开发项目中经常遇到拉到最新代码,发现中文注释都是乱码,很是emjoy.....这是由于编码格式不匹配造成的,如果你的注释是 UTF-8 编码,而文件编码是 GBK 或者其他编码,那么就会出现乱码现象。
2023-12-11 21:00:36
5817
原创 13.纤程(Fiber)与协程(Coroutine)
13.1 纤程纤程(Fiber)是 Windows 操作系统提供的概念。什么是纤程呢?当我们需要异步执行一些任务时,常用的一种做法就是开启一个工作线程,在工作线程中执行我们的任务。但是这样存在两个问题:由于线程的调度是操作系统内核控制的,我们没法准确地确定操作系统何时会运行或挂起该线程; 对于一些轻量级的任务,创建一个新的线程去做,消耗比较大,我们不希望有这种消耗。那么有没有一种机制,既能起到新建线程执行任务,又没有新建线程消耗那么大呢?有,这就是纤程。在 Windows 中一个线程中可
2023-12-10 14:39:27
1716
1
原创 12.线程池与队列系统的设计
不过是一组线程而已,一般情况下,我们需要异步执行一些任务,这些任务的产生和执行是存在于我们程序的整个生命周期的,与其让操作系统频繁地为我们创建和销毁线程,我们通常需要创建一组在我们程序生命周期内不会退出的线程,为了不浪费系统资源,我们的基本要求是当有任务需要执行时,这些线程可以自动拿到任务去执行,没有任务时这些线程处于阻塞或者睡眠状态。当然,技术上除了要解决线程池的创建、往队列中投递任务、从队列中取任务处理,我们还需要做一些善后工作,如线程池的清理,即如何退出线程池中的工作线程和清理任务队列。
2023-12-10 14:37:02
1235
原创 11.C库的非线程安全函数
结构体指针类型,而我们外部并不需要释放这个指针指向的内存,因此我们断定这个函数内部一定使用了一个全局变量或函数内部的静态变量。这样的话,当再次调用这个函数时有可能前一次调用结果就被后一个结果覆盖了。是因为最初编写很多 CRT 函数时,还没有多线程技术,所以很多函数内部实现都使用了函数内部的静态变量和全局变量。随着多线程技术的出现,很多函数出现了对应的多线程安全版本,如。因此我们在实际开发中应避免在多线程程序中使用这类函数,这类函数还有如。这类 CRT 提供的具有上述行为的函数,我们称为。
2023-12-10 14:29:19
514
原创 10.线程局部存储
对于一个存在多个线程的进程来说,有时候我们需要有一份数据是每个线程都拥有一份的,也就是说每个线程自己操作自己的这份数据,这有点类似 C++ 类的实例属性,每个实例对象操作的都是自己的属性。我们把这样的数据称之为。上述程序一共创建 5 个线程,每个线程都会自己生成一个日志文件,每个线程将自己的日志写入自己的文件中,当线程执行结束时,会关闭打开的日志文件句柄。是一个线程局部变量,因此该进程中每一个线程都会拥有这样一个变量副本,由于是不同的副本,)数据,因为进程中的所有线程都可以使用返回的键,所以参数。
2023-12-10 14:24:05
1023
原创 09.多线程使用锁实践经验总结
前面也说过,这种逻辑非常容易因为疏忽忘记在某个地方加上解锁代码而造成死锁,所以一般建议使用 RAII 技术将加锁和解锁代码封装起来,也就是说,我们可以定义一个锁对象包装类,其成员变量含有一个锁对象,在该包装类的构造函数中对锁对象进行加锁,在析构函数中对锁对象进行解锁,这样在函数出口处,锁对象包装类由于出了作用域被析构进而对其锁对象进行解锁。所谓减小锁使用粒度指的是尽量减小锁作用的临界区代码范围,临界区的代码范围越小,多个线程排队进入临界区的时间就会越短。请求锁,以免出现“活锁”现象,这是对资源的一种浪费。
2023-12-10 14:21:34
884
原创 08.如何确保创建的线程一定运行起来?
不知道读者注意到没有,我在介绍上述说的确保线程一定运行起来的做法时使用了两个词——“古老”和“严谨”,“严谨”不用多介绍,之所以说“古老”是因为你现在在各种新型的项目中基本上再也看不到这种确保线程运行起来的做法了,许多年以前多线程编程开始流行起来的时候,那时由于软硬件的水平限制,加之很多开发人员对多线程编程技术的不熟悉,创建新线程时确保一个线程跑起来非常必要;基于以上思路,我们创建一组线程时,可以一个一个地创建,每成功运行一个新线程再创建下一个,确保线程组中的每一个线程都可以运行起来。
2023-12-10 14:20:10
449
原创 07.C++11/14/17线程同步对象
C++ 11 标准让很多开发者诟病的原因之一是,C++ 新标准借鉴 boost 库的 boost::mutex、boost::shared_mutex 而引入 std::mutex 和 std::shared_mutex,但是在 C++11 中只引入了 std::mutex,直到 C++ 17 才有 std::shared_mutex,这让只能使用仅支持 C++11 标准的编译器(例如 Visual Studio 2013,gcc/g++ 4.8)的开发者非常不方便。
2023-12-10 14:19:13
973
原创 06.Windows线程资源同步对象
需要说明的是,临界区对象通过保护一段代码不被多个线程同时执行,进而来保证多个线程之间读写一个对象是安全的。也就是说,当其中一个线程离开临界区,即使此时有其他线程在这个临界区外面等待,由于线程调度的不确定性,此时正在等待的线程也不会有先进入临界区的优势,它和刚离开这个临界区的线程再次竞争进入临界区是机会均等的。当然,在实际开发中这种方式是靠不住的,线程调度是操作系统内核的策略,应用层上的应用不应该假设线程的调度策略是按预想的来执行,但是理解线程与临界区之间的原理有助于你编写出更高效的代码来。
2023-12-10 14:16:53
1021
原创 05.Linux线程同步对象
某个线程A在条件不满足的情况下,主动让出互斥体,让其他线程去折腾,线程在此处等待,等待条件的满足;线程A之所以可以安心等待,依赖的是其他线程的协作,它确信会有一个线程在发现条件满足以后,将向它发送信号,并且让出互斥体。因为某次操作系统唤醒pthread_cond_wait时tasks.empty()可能仍然为 true,言下之意就是操作系统可能会在一些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件 变量的线程也有可能会醒来的情形。的,因为多个线程会同时读写之。
2023-12-10 14:10:24
1024
原创 04.整型变量的原子操作
因此,如果读者想利用C++11提供的std::atomic库编写跨平台的代码,在使用std::atomic提供的方法时建议参考官方std::atomic提供的接口说明来使用,而不是想当然地认为一个方法在此平台上可以运行,在另外一个平台也能有相同的行为,避免出现上面说的这种情形。在C++ 98/03标准中,如果想对整型变量进行原子操作,要么利用操作系统提供的相关原子操作API,要么利用对应操作系统提供的锁对象来对变量进行保护,无论是哪种方式,编写的代码都无法实现跨平台操作,例如上一小介绍的。
2023-12-10 14:07:58
1094
原创 03.线程函数传C++类实例指针惯用法
对于实例方法,为了保证类方法的正常功能,C++编译器在翻译时,会将类的实例对象地址(也就是this指针)作为第一个参数传递给该方法,也就是说,翻译后的。综上所述,如果不使用C++11的语法,那么线程函数只能使用类的静态方法,且函数签名必须符合线程函数的签名要求。指针作为线程函数的唯一参数传入,这样在线程函数中,可以通过线程函数参数得到对象的指针,通过这个指针就可以自由访问类的实例方法了。类就没有这个限制,即使类成员函数是类的实例方法也可以,但是必须显式地将线程函数所属的类对象实例指针(在类的内部就是。
2023-12-10 14:03:50
960
原创 02.线程基本操作
在pstack输出的各个线程中,只要逐一对照我们的程序源码来梳理下该线程中是否有大多数时间都处于空转的逻辑,然后修改和优化这些逻辑就可以解决CPU使用率过高的问题了,一般情况下,不工作的线程应尽量使用锁对象让其挂起,而不是空转,这样可以提高系统资源利用率。获取的线程ID是系统范围内全局唯一的,一般是一个不会太大的整数,这个数字也是就是所谓的LWP (Light Weight Process,轻量级进程,早期的Linux系统的线程是通过进程来实现的,这种线程被称为轻量级进程)的ID。这里可以使用Linux。
2023-12-10 13:59:53
1114
原创 01.线程的基本概念
但是就一个程序本身执行的操作来说,进程其实什么也不做(不执行任何进程代码),它只是提供一个大环境容器,在进程中实际的执行体是”一般来说,每个线程都是独立执行的单位,每个线程都有自己的上下文堆栈,一个线程的崩溃不会对其他线程造成影响。错误,这个错误会产生一个信号,操作系统默认对这个信号的处理就是结束进程,整个进程都被销毁了,这样的话这个进程中存在的其他线程自然也就不存在了。系统中,如果主线程退出,工作线程一般不会受到影响,还会继续运行下去,但是此时这个进程就会变成所谓的。,我们把这个线程称之为”
2023-12-10 13:55:55
930
原创 利用 CMake 生成 Visual Studio 工程文件
对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。凡是可以使用 CMake 工具编译的 Linux 程序(即提供了。
2023-12-10 13:54:54
1293
原创 如何学习 CMake
对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。那么是不是意味着你必须学习 CMake 的方方面面,不是的,你只要掌握 CMake 常用语法和命令即可。
2023-12-10 13:39:32
1051
原创 一款远程控制软件 —— pcshare
3. 生成一个新的宿主程序,这个程序的名称叫ps.exe,然后将ps.exe与PcStat.exe一起发给要被控制的机器上。在被控制的机器上启动PcStat.exe,过一会儿被控制端就连接上控制终端了,控制终端就可以对被控制终端进行各种控制了。控制端通过寄生在被控制端的后台程序来实现控制,可以对被控制台进行文件管理、屏幕监控、键盘监控、监控管理、查看被控制端的服务和注册表,甚至是控制被控制端的摄像头。1. 启动PcShare.exe,这是控制端主程序,该程序会在8080端口上监听被控制端的连接。
2023-12-09 23:34:19
632
原创 C++学习新书单 —— 第 1 篇
自从 C++11 强化了右值语义,引入了右值引用、移动构造函数和赋值移动函数以及 std::move 等方法,右值的语义被广泛地用于各种 C++ 项目,加上 stl 库常用类都支持了移动操作,用好右值语义能让你的程序节省大量内存、运行效率更高。如果你也对 C++ 右值语义感兴趣,并想利用右值写更好更快的 C++ 代码,不妨读一读,书的篇幅也不厚,读完花不了多长时间。我学习和使用 C/C++ 开发快 13 年了,目前在大厂做 C++ 开发,我整理了一套 C/C++ 优质学习资料————
2023-12-09 23:15:28
848
原创 如何在 Visual Studio 编译调试 Windows 版本的 Nginx 源码?
根据这个帮助文档,我们需要安装如下依赖环境:其中,Mercurial 不是必需的,我们可以根据官方给的这个链接,安装 Visual Studio 2022、MSYS2、Strawberry Perl,并下载三个依赖库,我们实际下载的三个文件名和版本号是:官网。
2023-12-09 23:04:30
1213
原创 阅读开源项目的一些经验分享
必看 Nginx 经典书籍(含下载方式)mp.weixin.qq.com/s/Rgzzqvl9pik7zVzNX8n8PA编辑以上三种方式都是不错的阅读源码的方式,读者可以根据自己的水平、目的和所处阶段去使用。
2023-12-09 22:49:10
898
原创 C++中,i=1 是原子操作吗?
在正式回答这个问题之前,我给你讲一个我的故事。我刚开始参加工作的那年,公司安排我开发一款即时通讯软件(类似于 QQ、微信这种聊天软件),在这之前我心里也知道如果多线程操作一个整型值是要加锁的,但是当时为了图代码简便,而且在实际调试的时候,没有加锁的代码也从来没出过问题。于是我就心存侥幸了,觉得对多线程操作整型值加锁真是多此一举。我们的软件有类似于微信这种单人聊天功能,每个用户都使用一个整型的 userid,问题就出在这里。
2023-12-09 22:42:09
1115
原创 推荐一些好的编程习惯
例如,定义变量时尽量给一个有效的初始值,释放指针对象指向的资源时,尽量将指针设置为 NULL(对于 C/C++ 程序排查一个空指针问题远比排查野指针问题要容易得多),使用 RAII 技术保证资源在每条出口路径上都会被释放,多线程加锁时,尽量减小锁的粒度,加多个锁时,锁的方向一致,避免死锁等等。很多同学在遇到问题时,习惯上去百度等搜索引擎上去寻找答案,解决问题后,就直接过去了,下次遇到同样的问题,可能又去搜索引擎继续搜索,这样日复一日,功能做了一个又一个,技术毫无长进。目前就想到这么多,原创不易,请给。
2023-12-09 14:30:22
1172
myreactor项目C++11版本源代码
2016-12-04
即时通讯flamingo服务器端代码
2017-04-06
即时通讯flamingo客户端
2017-04-06
文章《用Android Studio进行NDK编程》配套资源
2018-04-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人