Skykey's Home

Skykey的私人博客ᕕ( ᐛ )ᕗ

Skykey

Hello,World! 👋

Hi, I’m Skykey 😉, a programmer 👨🏻‍💻 from China 🇨🇳. I’m an open-source profession and always develop in Cpp/Qt. Currently, I’m working on QtDocCN. Besides programming, I like delicious food 🥗🥩🌮🍣 and doing sports 🏃⛹️‍♂️🏋🏼‍♂️.

阅读全文 »

C++类对象的内存分布

写在前面

C++类初始化成一个对象之后,该对象实例在内存中是如何分布的呢?

C++类对象的内存分布是面试的热点话题,几次C++研发岗的面试十有八九面试官都会问到类对象的内存分布问题。于是乎我整理了一下这阵子关于类对象内存分布的笔记,整理成一篇博客供大家参考。

本文将类对象的内存分布分为种情况:空类情况含成员变量,不含成员函数的情况带成员函数的情况带虚函数的情况。在讨论内存分布时,我们也将探讨C++中一个极为重要的原则,内存对齐原则

阅读全文 »

无锁编程简介(翻译)——译自《An Introduction to Lock-Free Programming》

写在前面

本文翻译自经典博文《An Introduction to Lock-Free Programming》,是一篇有关于无锁编程的经典文章。由于译者水平优先,如有谬误实所难免,还请指正。

阅读全文 »

关于std::thread的二三事

写在前面

很早之前写过一篇关于线程池文章,《基于C++11实现线程池》,一直被网友翻出来,对里面的一些细节实现提了许多问题。其实更推荐大家去阅读后来写的另外一篇关于线程池的文章,《当我谈线程池时我谈些什么——线程池学习笔记》。原因很简单,写第一篇线程池文章的时候,自己属实是菜的不行(现在依旧是菜的不行),花了很长时间去学习一些里面用到的C++11的新语法,文章里面讲的重点也是涉及到的C++11语法。所以,更关心线程池本身的实现的话,更适合去看新文章《当我谈线程池时我谈些什么——线程池学习笔记》,作为现代C++语法的新学者,想花更多精力在学习现代C++语法的话,适合去看老文章《基于C++11实现线程池》。

言归正传,在那篇老文章里有挺多网友提了一些std::thread相关的问题。今天看了会cppreference,写了点代码实践了下,集中回答了一些问题,顺便水篇文章算是学习笔记了。

阅读全文 »

Linux低延迟服务器调优

概述

本文基于饶萌大佬的《Linux低延迟服务器系统调优》一文总结整理,自行补充了一些细节。大佬博文指路:

Linux低延迟服务器系统调优

低延迟关键不在于低,而在于稳定,稳定即可预期,可掌控,这对高频领域来说尤其重要。谈及Linux低延迟技术时,人们经常提到“Kernel Bypass”(内核旁路),即绕过内核,这是因为内核处理不仅慢且延迟不稳定。因此一个延迟要求很高的实时任务是不能触碰内核的,“避免触碰”是一个比Bypass更高的要求:不能以任何方式进入内核。中断(Interrupt)是进入内核的方式之一,本文的关键点也在于避免关键线程被中断。即使中断发生时线程是空闲的,但重新回到用户态后CPU缓存被污染了,下一次处理请求的延迟也会变得不稳定。

阅读全文 »

Qt实现简易心跳包机制

因为网络通信的不稳定性,在一些实时性、网络稳定性要求较高的情境下,我们需要一个实时检测客户端与服务端之间的连接状态和通信功能是否运行正常的机制,心跳包机制便是其中之一。接下来我会讲一下在之前的一个小项目中,利用Qt实现的简易心跳包检测机制。

阅读全文 »

当我谈线程池时我谈些什么

最近跟着purecpp社区里的两篇博文复习了一下两种线程池的C++实现(单任务队列、多任务队列),相比于之前那篇C++11实现线程池的博文,语言版本进行了一点小更新(C++14-C++17)。在这里结合代码记录一下学习心得。

12.12,然然首播一周年辣(嘉然小姐首播周年快乐)

阅读全文 »

C++日期与时间编程(C++11-C++17)

0x00 导言

日期和时间是在编程中常常接触到的东西,而C++也为程序员提供了强(复)大(杂)的日期和时间编程的相关支持。在C++20标准中,C++的chrono库继C++11标准后也迎来了空前绝后大更新,但本文讨论的重点主要集中在C++11至C++17标准中日期和时间相关的内容,C++20标准中的chrono新东西完全可以另开一个坑。

在翻了N篇cppreference标准、chrome爽吃我800Mb的内存之后,我果断决定把这次的学习心得记下来,以防以后全部忘光光(实在太多了.jpg)。本片学习心得纯新手向,求大佬轻喷。

阅读全文 »

基于C++11实现线程池

0x00 导入

前些日子通过阅读几篇博客,大体学习了一下C++的并发编程(主要是多线程、异步部分)。手撸了一个多生产者-多消费者模型之后,最终觉得这也只是小打小闹而已,需要整个硬货。经过一番思考之后,手撸一个线程池貌似是一个非常合适的练习。线程池前前后后一共折腾了四五个小时左右,最令我意外的是——原本以为最难理解的并发部分反而是最简单的部分,线程池实现中大量的CPP11语法糖才是真正影响我理解的部分。经过三四个小时的阅读博文、查阅资料以及向大佬求教之后,我才真正对线程池实现有了比较深入地理解。“纸上得来终觉浅,绝知此事要躬行。”经历这一番折腾后才清楚地认识到了自己对CPP11理解的薄弱,遂写下这篇博客来总结自己对线程池实现以及所涉及到的CPP11语法糖的理解,方便自己以后再次阅读源码时有所考据。

文章大量借鉴、节选了众多参考资料,并结合自己的理解进行讲解。参考资料会在最后列出。

这篇总结会将重心放在C++11的语法糖上,对于C++11的并发编程部分(std::thread, std::future等)将仅进行最简洁最必要的阐述。有关并发编程部分可以移步至几篇大佬总结的比较好的博文中进行补充学习:

  1. 《C++并发编程(从C++11到C++17)》:https://paul.pub/cpp-concurrency
  2. 《从pthread转换到std::thread》:https://segmentfault.com/a/1190000002655852
  3. 《货比三家:C++中的task based并发》:https://segmentfault.com/a/1190000002706259
阅读全文 »