自定义博客皮肤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)
  • 收藏
  • 关注

原创 13.纤程(Fiber)与协程(Coroutine)

本专栏介绍了介绍了目前主流的 C/C++ 开发环境下的两个操作系统 Windows 和 Linux 系统层面上的线程原理和多线程资源同步技术的方方面面,同时基于这些基础知识延伸出了更高级的线程池技术和队列系统,也介绍了目前前沿的协程技术。

2023-12-09 09:48:27 112

原创 12.线程池与队列系统的设计

在很多新手的认知中,线程池和队列系统 是一项非常高深的技术,其实也不然,当你熟练掌握了多线程编程技术后,这一切将会变的很容易,你需要克服的是内心的恐惧而已。所谓线程池不过是一组线程而已,一般情况下,我们需要异步执行一些任务,这些任务的产生和执行是存在于我们程序的整个生命周期的,与其让操作系统频繁地为我们创建和销毁线程,我们通常需要创建一组在我们程序生命周期内不会退出的线程,为了不浪费系统资源,我们的基本要求是当有任务需要执行时,这些线程可以自动拿到任务去执行,没有任务时这些线程处于阻塞或者睡眠状态。

2023-12-09 09:43:14 67

原创 11.C库的非线程安全函数

是因为最初编写很多 CRT 函数时,还没有多线程技术,所以很多函数内部实现都使用了函数内部的静态变量和全局变量。因此我们在实际开发中应避免在多线程程序中使用这类函数,这类函数还有如 strtok,甚至连操作系统提供的 socket 函数 gethostbyname 也不是线程安全的。这个函数返回一个 tm 结构体指针类型,而我们外部并不需要释放这个指针指向的内存,因此我们断定这个函数内部一定使用了一个全局变量或函数内部的静态变量。这样的话,当再次调用这个函数时有可能前一次调用结果就被后一个结果覆盖了。

2023-12-09 09:39:17 67

原创 10.线程局部存储

对于一个存在多个线程的进程来说,有时候我们需要有一份数据是每个线程都拥有一份的,也就是说每个线程自己操作自己的这份数据,这有点类似 C++ 类的实例属性,每个实例对象操作的都是自己的属性。我们把这样的数据称之为线程局部存储(Thread Local Storage,TLS),对应的存储区域叫做线程局部存储区。

2023-12-09 09:35:51 55

原创 09.多线程使用锁实践经验总结

在本专栏前面的几篇文章中,我们介绍了 Windows 和 Linux 操作系统提供的各种常用锁对象的使用原理使用方法。多线程编程少不了与这些锁打交道,在使用锁时稍不注意就可能会造成死锁或者程序性能的问题。

2023-12-09 09:30:46 13

原创 08.如何确保创建的线程一定运行起来?

不知道读者注意到没有,我在介绍上述说的确保线程一定运行起来的做法时使用了两个词——“古老”和“严谨”,“严谨”不用多介绍,之所以说“古老”是因为你现在在各种新型的项目中基本上再也看不到这种确保线程运行起来的做法了,许多年以前多线程编程开始流行起来的时候,那时由于软硬件的水平限制,加之很多开发人员对多线程编程技术的不熟悉,创建新线程时确保一个线程跑起来非常必要;基于以上思路,我们创建一组线程时,可以一个一个地创建,每成功运行一个新线程再创建下一个,确保线程组中的每一个线程都可以运行起来。

2023-12-09 09:26:55 16

原创 07.C++11/14/17线程同步对象

在 C/C++ 语言中直接使用操作系统提供的多线程资源同步 API 虽然功能强大,但毕竟存在诸多限制,且同样的代码却不能同时兼容 Windows 和 Linux 两个平台;再者 C/C++ 这种传统语言的使用份额正在被 Java、python、go 等语言慢慢蚕食,很大一部分原因是 C/C++ 这门编程语言在一些功能上缺少“完备性”,如对线程同步技术的支持,而这些功能在像 Java、python、go 中是标配。

2023-12-09 09:23:44 22

原创 05.Linux线程同步对象

Linux互斥体的用法和Windows的临界区对象用法很相似,一般也是通过限制多个线程同时执行某段代码来达到保护资源的目的。和接下来要介绍的信号量、条件变量一样,Linux互斥体都实现在 NPTL (Native POSIX Thread Library)。在NPTL中我们使用数据结构pthread_mutex_t来表示一个互斥体对象(定义于pthread.h头文件中)。互斥体对象我们可以使用两种方式来初始化:使用pthread_mutex_init函数初始化。

2023-12-09 09:13:26 19

原创 04.整型变量的原子操作

前面几节介绍了线程的基础知识,从本节开始,我们讨论的主题为线程之间的同步技术。所谓线程同步技术,指的是多个线程同时操作某个资源(从程序的术语来说,这里的资源可能是一个简单的整型变量,也可能是一个复杂的C++对象)。多线程同时操作资源指的是多线程同时对资源的读和写,我们需要采取一些特殊的措施去保护这些资源,以免引起一些资源访问冲突(如死锁)或者得到意料外的结果。当然,最简单的资源类型应该就是整形变量了。

2023-12-09 09:12:42 18

原创 03.线程函数传C++类实例指针惯用法

前面的几篇文章介绍了除了C++11的线程库提供了的std::thread类对线程函数签名没有特殊要求外,无论是Linux还是Windows的线程函数的签名都必须是指定的格式,即参数和返回值必须是规定的形式。如果是类的静态方法,那么就没法访问类的实例方法了,为了解决这个问题,我们在实际开发中往往会在创建线程时将当前对象的地址(this指针)传递给线程函数,然后在线程函数中,将该指针转换成原来的类实例,再通过这个实例就可以访问类的所有方法了。那么类的实例方法就一定不能作为线程函数了吗?

2023-12-09 09:10:20 22

原创 06.Windows线程资源同步对象

在介绍 Windows 线程资源同步对象之前,我们先来介绍一下两个与之相关的、非常重要的函数,即WaitForSingleObject和WaitForMultipleObjects。这个函数的作用是等待一个内核对象,在Windows系统上一个内核对象通常使用其句柄来操作,参数hHandle即需要等待的内核对象,参数dwMilliseconds是等待这个内核对象的最大时间,时间单位是毫秒,其类型是DWORD,这是一个unsigned long类型。

2023-12-09 09:09:55 21

原创 02.线程基本操作

在使用线程之前,我们首先要学会如何创建一个新的线程。不管是哪个库还是哪种高级语言(如Java),线程的创建最终还是调用操作系统的API来进行的。我们这里先介绍操作系统的接口,这里分Linux和Windows两个常用的操作系统平台来介绍。当然,这里并不是照本宣科地把Linux man手册或者msdn上的函数签名搬过来,这里只介绍我们实际开发中常用的参数和需要注意的重难点。

2023-12-08 21:29:42 40

原创 01.线程的基本概念

线程的英文单词是thread,翻译成对应的中文有”分支“、”枝干“的意思,当然这里翻译成”线程“属于意译了。提到线程就不得不提与线程相关联的另外一个概念”进程“,一个”进程“代表计算机中实际跑起来的一个程序,在现代操作系统的保护模式下,每个进程拥有自己独立的进程地址空间和上下文堆栈。但是就一个程序本身执行的操作来说,进程其实什么也不做(不执行任何进程代码),它只是提供一个大环境容器,在进程中实际的执行体是”线程“。

2023-12-08 21:16:42 21

原创 利用 CMake 生成 Visual Studio 工程文件

对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。这里我们以著名的开源网络库 libuv (node.js 背后的 WebServer 实现)为例。

2023-12-08 21:11:38 197

原创 如何学习 CMake

cmake 是目前管理 C++ 工程,尤其是一个大型 C++ 项目常用的一个工具,尤其是 Linux C/C++ 项目,主流的网络库,例如 libevent、libuv 基本上都使用 cmake 管理项目。那么是不是意味着你必须学习 CMake 的方方面面,不是的,你只要掌握 CMake 常用语法和命令即可。常用的命令有:如何设置项目源码目录如何设置项目 include 目录如何设置依赖的库目录如何指定可执行程序的生成方式(包括可直接运行的和依赖库(.so 和 .a 文件))

2023-12-08 21:10:21 16

原创 一款远程控制软件 —— pcshare

1. 启动PcShare.exe,这是控制端主程序,该程序会在8080端口上监听被控制端的连接。2. 生成被控制端宿主程序,点击控制端主界面上的“生成客户按钮”:3. 生成一个新的宿主程序,这个程序的名称叫ps.exe,然后将ps.exe与PcStat.exe一起发给要被控制的机器上。在被控制的机器上启动PcStat.exe,过一会儿被控制端就连接上控制终端了,控制终端就可以对被控制终端进行各种控制了。

2023-12-08 21:05:06 28

原创 C++ 学习新书单 —— 第 2 篇

如果你也对 Lambda 表达式的方方面面感兴趣语义感兴趣,并希望使用 lamda 表达式写更好更快的 C++ 代码,不妨读一读,书的篇幅也不厚,读完花不了多长时间。,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。我学习和使用 C/C++ 开发快 13 年了,目前在大厂做 C++ 开发,我整理了一套 C/C++ 优质学习资料————》,我们介绍了一本系统地讲解 C++ 右值语义的图书《

2023-12-08 21:00:55 37

原创 Linux epoll 源码分析.pdf

一个线程使用 epoll_wait 检测事件,同时另外一个线程使用 epoll_ctl 从该 epollfd 上增加、移除或者修改事件标志,这是否是线程安全的?epoll 的水平模式和边缘模式在读写上到底有什么差别?可以看看下面关于 epoll 模型的源码分析。epoll 何时使用效率比较高?

2023-12-08 20:54:33 22

原创 C++学习新书单 —— 第 1 篇

我学习和使用 C/C++ 开发快 13 年了,目前在大厂做 C++ 开发,我整理了一套 C/C++ 优质学习资料————CppGuide,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。这本书讲解右值语义的产生和发展以及在程序中的作用,层层深入,且图书文字本身写的通俗易懂。如果你也对 C++ 右值语义感兴趣,并想利用右值写更好更快的 C++ 代码,不妨读一读,书的篇幅也不厚,读完花不了多长时间。

2023-12-08 20:52:19 24

原创 CppGuide 学习资料

内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。小方深知新手学习 C/C++ 的重要性和疑难问题,因此特地给 C/C++ 开发的同学精心准备了一份优质学习资料————小方学习和使用 C/C++ 开发快 13 年了,目前在大厂做架构,面试和指导千人成功找到满意的 C/C++ 岗位。

2023-12-08 20:49:01 83

原创 如何在 Visual Studio 编译调试 Windows 版本的 Nginx 源码?

注意:如果在这个过程中提示找不到 sed,sed 原是 Linux 下的程序,我们安装了 MSYS2 之后,在 MSYS2 安装目录下就有了这个文件,叫 sed.exe,将这个文件添加到电脑环境变量 PATH 中即可,例如我的机器上的目录是 D:\msys64\usr\bin。我们将 ngx_modules.c 和同目录下 ngx_auto_headers.h 和 ngx_auto_config.h 添加到工程中去,为了保持目录结构,我们在工程中新建一个 objs 目录。

2023-12-08 20:44:43 47

原创 阅读开源项目的一些经验分享

我之前在携程旅行网做基础架构时,为了学习 Redis,我一边研究 Redis 的源码,一边编写了利用 GDB 调试 Redis 的教程。调试是学习开源项目非常好用的一个方法。对于做 Linux C++ 开发一定要会用 GDB 调试 C/C++ 程序。熟练掌握 gdb 调试等于拥有了学习优秀 C 和 C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。我当时写这套教程有两个初衷:网上很多关于 gdb 的教程都是零散的,不成体系;

2023-12-08 20:32:57 23

原创 包装开源项目作为自己的项目,来字节面试,这位同学现场翻车了......

最近在 github 上找了一个开源的 C++ 版本的 http server 代码,如果你很好奇,为什么我会看起这个项目来,可以拉到文末。这个项目在 github 上看起来挺流行的,有 7.4k 的 star 和 1.6k 的 fork,属于比较受欢迎的项目了。深入地看了下该项目,有如下优点:代码整体风格和质量还不错,支持 C++ 11 语法;代码量不大,如果想在项目中使用,只要包含一个 httplib.h 头文件即可;

2023-12-08 20:19:05 32

原创 推荐一些好的编程习惯

有一句老话叫:正确的结果只有一种,错误的现象千奇百怪。对于高手程序员来说,他们并不是不写 bug,而是通过良好的编程习惯在开发阶段避免了百分之八十的 bug。所以一些良好的编程习惯非常重要。

2023-12-08 20:18:14 12

原创 Go语言好找工作吗?

Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。我目前在字节跳动做 Go 开发,需要内推的可以私信我。

2023-12-08 20:14:45 102

原创 C++中,i=1 是原子操作吗?

关注我的读者,你有任何编程问题也可以在知乎邀请我回答哦~

2023-12-08 20:12:01 153

原创 如何学习 gdb?如何学习 Linux C/C++ 调试?

等你熟悉了 Linux 命令行之后,学习 gdb 就容易一点了,但是还是要多练,常用的 gdb 命令并不多,但是也需要一些调试和操作系统的基础知识,如断点、调用堆栈、线程等概念,如果你已经了解了这些基础概念之后,学习 gdb 就不难了,只要你肯练习,十分钟内足可掌握,但是要灵活使用 gdb 调试还是需要多加练习,建议用 gdb 去调试一些工业级的开源项目,例如 Nginx、Redis 这样的源码。介绍了实际工作中 gdb 的各种高级调试技巧,例如如何显示超长字符串、如何使用 gdb 调试多进程程序等等;

2023-12-07 19:48:05 17

原创 推荐一款比 Postman 好用 20 倍的开发工具

无论使用什么语言开发,无论是 HTTPS、Websocket、TCP、UDP 等什么协议,还是 Restful、SOAP、WebService 等什么规范,Eolink 都可以协助团队快速、统一、规范地管理起来。截至目前,Eolink已经为包括奇安信、深信服、泰康集团、索尼、统一企业、博时基金、圆通速递等数千家各行业领先的企业提供API管理服务,实力非常硬,口碑非常好,值得信赖!目前SaaS产品 完全免费,你可使用web版,也可下载桌面端,Windows、Mac、Linux 平台均支持!

2023-12-07 19:44:33 75

原创 如何学习 Windows 编程?

相比较其他编程,有人说 Windows 编程已经日薄西山了,其实也不尽然。我们大多数人的工作和娱乐的电脑仍然是 PC 机和 Windows,只不过因为 Windows 上的各种软件我们已经熟悉到觉得它们存在是那么理所当然了,开发这样的软件的技术已经处于一个相对稳定和成熟的阶段。就职业发展来讲,如果你生活在二三线城市,掌握了 Windows 编程,你可以在 Windows 开发各种桌面软件,这会大大增加你的经济收入。计算机必看经典书籍(含下载方式)

2023-12-07 19:40:32 53

原创 C++代码优化应该怎么学?

当然,这本书中介绍的一些优化技巧,新版本的 C++ 编译器已经代开发者所做,但是这本书介绍了其背后的原理和思路。C++ 代码要想写好,关键点并不在于你有多么熟悉 C++ 的语法,而是要求开发者熟悉编译器以及背后的操作系统是如何支撑的,基于此不断优化你的代码,这需要不断的积累与总结,当然,也可以通过一些书籍去学习。这本书是一本 C++ 代码优化指南。书中主要内容有:代码优化的意义和总原则,与优化有关的计算机硬件背景知识,能行分析方法及工具,优化字符串的使用,算法、查找和排序等等。

2023-12-07 19:21:35 12

原创 二本本科生如何才能进入腾讯/阿里/百度这样的大厂?

以上就是那天我给这位同学的建议。好在,两年过去了,天道酬勤,功不唐捐,一位二本的同学逆袭拿到了大厂的 offer,在毕业之际为自己的职业生涯开了一个好头,祝这位同学发展越来越好。作为一名过来人的老学长,我码这么多字,希望想做好开发的学弟学妹们,勿在浮沙筑高台。如果你现在还是学生,你有大把读书的机会,一定要珍惜大好读书时光。工作年限不长的同学,也应该尽快在工作的早些年把基本功打扎实。三十岁以后面临着工作、家庭等各种问题,你可能再不能心无旁骛地去学习和提升了。

2023-12-07 19:13:53 246

原创 我把 b 站拉黑了!

无意中在知乎看到这样一个提问:感觉算法在程序员中快被吹上天了,如果只是搞编程的话,是不是没必要死磕算法?看到不少人各种吹算法,什么刷leetcode啥的,之前刚入门编程之前我也以为算法有那么重要,我还担心我那点算法功底进公司抗不了几天就被劝退了,身边也见过不少刷题家,完全把自己刷魔怔了,只会刷题,连接个linux服务器问我说用windows远程连接能连接上吗?看到这个问题,想想我曾经的经历,我真是百感交集啊,默默地流下了苦涩的泪水。

2023-12-07 19:07:09 18

原创 TCP 源码实现超详细注释版.pdf

hi 大家好,今天给大家分享一个经典的 TCP 源码分析PDF,基于比较新的内核版本-Linux 4.4.0,从用户态 TCP 编程,到 TCP RFC 协议,TCP收发路径,TCP三次握手和四次挥手,TCP 拥塞控制等方方面面的 Linux 实现进行分析注释,从中我们可以学习到内核是怎么实现 TCP 协议的,从而对 TCP 协议原理有更深刻的理解,才能更快地解决真正的问题,源码面前,了无秘密。链接:提取码: zb8f。

2023-12-07 19:04:14 30

原创 当面试官问 C++ 11 新特性的时候,应该怎样回答?

GitHub - balloonwj/flamingo: flamingo 一款高性能轻量级开源即时通讯软件我为 Flamingo 专门录制了三部高清技术讲解视频以方便读者学习,视频中介绍了Flamingo的编译和部署方法、整体架构、各个模块的技术实现细节以及如何学习Flamingo的方法,视频下载链接:链接:提取码: id63。

2023-12-07 18:56:01 20

原创 两位我佩服的中国顶级程序员?

一位是云风——吴云洋,这是一位水平非常高的前辈,当年他一毕业就被网易 CEO 的丁磊一张机票接到网易去了,担任梦幻西游的主程序,这个游戏后来成了经典,也成就了网易。我那会儿读他写的游戏库代码以及他去网易的前后的故事、他如何招人、如何创业,非常钦佩。我上学的时候阅读风魂的代码,深有感慨,虽然代码的风格和变量命名如今看来略有稚嫩,但一个大学生可以熟练的用 C/C++ 和汇编写出流畅的程序,并且这个程序还能被商业公司使用的事迹,已经超过现在 99% 的计算机相关专业的大学生了。提取码: dwh5 )

2023-12-07 18:53:07 52

原创 华为最牛逼的 C++ 基础与提高 PDF

当年学习 C++ 的 PDF 文档,现在把它分享出来,图书目录如下:获取链接:链接: 提取码: 78yt。

2023-12-06 20:38:21 62

原创 如果你是一个 Java 面试官,你会问哪些问题?

最近换工作,对最近面试的过程进行总结,总结每个公司的面试流程和问到的面试题,记录自己,也供大家参考。我是一名 Java 开发,工作经验 10 年,所以面试一名高级 Java 开发工程师。简历投递平台,只使用了 Boss 直聘。由于生鲜电商裁员,我也是受害者的一员,就职的公司是*菜。2021 年 9 月 8 号开始开始投简历,2021 年 9 月 18 号关闭 Boss 简历,去掉周末面试 8 天。

2023-12-06 20:35:25 35

原创 如何设计保活机制与心跳包

以下内容节选自《》一书:在实际开发中,我们需要处理下面两种情形中遇到的问题:情形一: 一个客户端连接服务器以后,如果长期没有和服务器有数据来往,可能会被防火墙程序关闭连接,有时候我们并不想要被关闭连接。例如,对于一个即时通讯软件,如果服务器没有消息时,我们确实不会和服务器有任何数据交换,但是如果连接被关闭了,有新消息来时,我们再也没法收到了,这就违背了“即时通讯”的设计要求。

2023-12-06 20:26:38 27

原创 计算机网络方面有哪些书籍值得推荐?

首先奉上思维导图:如果你学习计算机网络不想只停留在理论上,希望可以能够达到自己编写一些网络通信程序,那我建议你这么学:你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值,我建议使用 tcpdump 命令实际抓下包就一目了然了,然后就是网络分层,各层的用途,重点熟悉下 TCP/IP 层相关的知识,还有就是 TCP/UDP 的区别,TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。学习这些知识的时候,一定不要死记硬背,注重理解。我近来面试了一部分学历学校非常好的同学,然而,在问到这块的

2023-12-06 20:21:38 94

原创 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目源码)

我推荐一套简单通用的后台管理系统,主要功能有:权限管理、菜单管理、用户管理,系统设置、实时日志,实时监控,API加密,以及登录用户修改密码、配置个性菜单等。

2023-12-06 20:17:12 54

空空如也

空空如也

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

TA关注的人

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