<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Skykey's Home</title><link>https://blog.skykey.systems/</link><description>Recent content on Skykey's Home</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 20 Jun 2022 10:04:00 +0800</lastBuildDate><atom:link href="https://blog.skykey.systems/index.xml" rel="self" type="application/rss+xml"/><item><title>C++/QT PC客户端面试题</title><link>https://blog.skykey.systems/2022/06/20/C++%E9%9D%A2%E8%AF%95/</link><pubDate>Mon, 20 Jun 2022 10:04:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/06/20/C++%E9%9D%A2%E8%AF%95/</guid><description>&lt;h1 id="C-QT-PC客户端面试题"&gt;&lt;a class="headerlink" href="#C-QT-PC客户端面试题" title="C++/QT PC客户端面试题"&gt;&lt;/a&gt;C++/QT PC客户端面试题&lt;/h1&gt;&lt;p&gt;整理记录一些春招时面试字节跳动/阿里云 C++/Qt PC客户端相关岗位的面试题，包含面试中遇到后整理的题目和面试前准备的资料。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;h2 id="父子继承时候，它构造函数和析构函数的顺序？析构时候，如何让父子类里所有的析构都调用一遍？"&gt;&lt;a class="headerlink" href="#父子继承时候，它构造函数和析构函数的顺序？析构时候，如何让父子类里所有的析构都调用一遍？" title="父子继承时候，它构造函数和析构函数的顺序？析构时候，如何让父子类里所有的析构都调用一遍？"&gt;&lt;/a&gt;父子继承时候，它构造函数和析构函数的顺序？析构时候，如何让父子类里所有的析构都调用一遍？&lt;/h2&gt;&lt;p&gt;构造时，先调用父类的构造函数，再调用派生类的构造函数。建楼从地基开始。&lt;/p&gt;&#10;&lt;p&gt;析构时，先调用子类的析构函数，再调用父类的析构函数。拆楼从最高层开始拆。&lt;/p&gt;</description></item><item><title>C++类对象的内存分布</title><link>https://blog.skykey.systems/2022/05/11/cpp_memory/</link><pubDate>Wed, 11 May 2022 16:02:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/05/11/cpp_memory/</guid><description>&lt;h1 id="C-类对象的内存分布"&gt;&lt;a class="headerlink" href="#C-类对象的内存分布" title="C++类对象的内存分布"&gt;&lt;/a&gt;C++类对象的内存分布&lt;/h1&gt;&lt;h2 id="写在前面"&gt;&lt;a class="headerlink" href="#写在前面" title="写在前面"&gt;&lt;/a&gt;写在前面&lt;/h2&gt;&lt;p&gt;C++类初始化成一个对象之后，该对象实例在内存中是如何分布的呢？&lt;/p&gt;&#10;&lt;p&gt;C++类对象的内存分布是面试的热点话题，几次C++研发岗的面试十有八九面试官都会问到类对象的内存分布问题。于是乎我整理了一下这阵子关于类对象内存分布的笔记，整理成一篇博客供大家参考。&lt;/p&gt;&#10;&lt;p&gt;本文将类对象的内存分布分为种情况：&lt;strong&gt;空类情况&lt;/strong&gt;，&lt;strong&gt;含成员变量，不含成员函数的情况&lt;/strong&gt;，&lt;strong&gt;带成员函数的情况&lt;/strong&gt;，&lt;strong&gt;带虚函数的情况&lt;/strong&gt;。在讨论内存分布时，我们也将探讨C++中一个极为重要的原则，&lt;strong&gt;内存对齐原则&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>无锁编程简介（翻译）——译自《An Introduction to Lock-Free Programming》</title><link>https://blog.skykey.systems/2022/02/26/%E6%97%A0%E9%94%81%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B%EF%BC%88%E7%BF%BB%E8%AF%91%EF%BC%89%E2%80%94%E2%80%94%E8%AF%91%E8%87%AA%E3%80%8AAn%20Introduction%20to%20Lock-Free%20Programming%E3%80%8B/</link><pubDate>Sat, 26 Feb 2022 16:10:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/02/26/%E6%97%A0%E9%94%81%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B%EF%BC%88%E7%BF%BB%E8%AF%91%EF%BC%89%E2%80%94%E2%80%94%E8%AF%91%E8%87%AA%E3%80%8AAn%20Introduction%20to%20Lock-Free%20Programming%E3%80%8B/</guid><description>&lt;h1 id="无锁编程简介（翻译）——译自《An-Introduction-to-Lock-Free-Programming》"&gt;&lt;a class="headerlink" href="#无锁编程简介（翻译）——译自《An-Introduction-to-Lock-Free-Programming》" title="无锁编程简介（翻译）——译自《An Introduction to Lock-Free Programming》"&gt;&lt;/a&gt;无锁编程简介（翻译）——译自《An Introduction to Lock-Free Programming》&lt;/h1&gt;&lt;h2 id="写在前面"&gt;&lt;a class="headerlink" href="#写在前面" title="写在前面"&gt;&lt;/a&gt;写在前面&lt;/h2&gt;&lt;p&gt;本文翻译自经典博文&lt;a href="https://preshing.com/20120612/an-introduction-to-lock-free-programming/" rel="noopener" target="_blank"&gt;《An Introduction to Lock-Free Programming》&lt;/a&gt;，是一篇有关于无锁编程的经典文章。由于译者水平优先，如有谬误实所难免，还请指正。&lt;/p&gt;</description></item><item><title>Never Say Goodbye 写于2.18离珠海前夜</title><link>https://blog.skykey.systems/2022/02/18/Never_Say_Goodbye/</link><pubDate>Fri, 18 Feb 2022 21:46:17 +0800</pubDate><guid>https://blog.skykey.systems/2022/02/18/Never_Say_Goodbye/</guid><description>&lt;h1 id="Never-Say-Goodbye-写于2-18离珠海前夜"&gt;&lt;a class="headerlink" href="#Never-Say-Goodbye-写于2-18离珠海前夜" title="Never Say Goodbye 写于2.18离珠海前夜"&gt;&lt;/a&gt;Never Say Goodbye 写于2.18离珠海前夜&lt;/h1&gt;&lt;p&gt;这几天一直过得浑浑噩噩的。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;iframe border="0" frameborder="no" height="86" marginheight="0" marginwidth="0" src="//music.163.com/outchain/player?type=2&amp;amp;id=1842025914&amp;amp;auto=1&amp;amp;height=66" width="330"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;一两年前一直很发愁，铁定了心不想升学，本科就出去当社畜，可是心里真的完全没底。本科就出去当社畜，最好的途径就是校招，校招要比社招难度低不少吧？不过我对这种事情也不算特别清楚。但是自己水平实在是菜的很，将来简历上都没什么好写的。只能靠笨鸟先飞，读书的时候就提前找实习积累一下经验，也能增加自己的竞争力。可是问题就出在这，之前一直很发愁，我到底能不能找到&lt;del&gt;合适的&lt;/del&gt;实习工作呢？为了找实习工作，也需要积累项目经验，需要刷算法题，需要刷面试题。项目实在写不了多少了，太菜，算法题也是刷着刷着就不想刷了，太累太费脑子，一直在拖拖拖摆烂。最后被兄弟提醒了一下，大三上的寒假就可以试着找实习工作了，立马紧张的不行，从兄弟那请教怎么写简历，在什么平台上找工作发简历，大体了解了一下面试的流程。&lt;/p&gt;</description></item><item><title>关于std::thread的二三事</title><link>https://blog.skykey.systems/2022/02/01/%E5%85%B3%E4%BA%8Estd_thread%E7%9A%84%E4%BA%8C%E4%B8%89%E4%BA%8B/</link><pubDate>Tue, 01 Feb 2022 17:54:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/02/01/%E5%85%B3%E4%BA%8Estd_thread%E7%9A%84%E4%BA%8C%E4%B8%89%E4%BA%8B/</guid><description>&lt;h1 id="关于std-thread的二三事"&gt;&lt;a class="headerlink" href="#关于std-thread的二三事" title="关于std::thread的二三事"&gt;&lt;/a&gt;关于std::thread的二三事&lt;/h1&gt;&lt;h2 id="写在前面"&gt;&lt;a class="headerlink" href="#写在前面" title="写在前面"&gt;&lt;/a&gt;写在前面&lt;/h2&gt;&lt;p&gt;很早之前写过一篇关于线程池文章，《&lt;a href="https://zhuanlan.zhihu.com/p/367309864" rel="noopener" target="_blank"&gt;基于C++11实现线程池&lt;/a&gt;》，一直被网友翻出来，对里面的一些细节实现提了许多问题。其实更推荐大家去阅读后来写的另外一篇关于线程池的文章，《&lt;a href="https://zhuanlan.zhihu.com/p/444375447" rel="noopener" target="_blank"&gt;当我谈线程池时我谈些什么——线程池学习笔记&lt;/a&gt;》。原因很简单，写第一篇线程池文章的时候，自己属实是菜的不行（现在依旧是菜的不行），花了很长时间去学习一些里面用到的C++11的新语法，文章里面讲的重点也是涉及到的C++11语法。所以，更关心线程池本身的实现的话，更适合去看新文章《&lt;a href="https://zhuanlan.zhihu.com/p/444375447" rel="noopener" target="_blank"&gt;当我谈线程池时我谈些什么——线程池学习笔记&lt;/a&gt;》，作为现代C++语法的新学者，想花更多精力在学习现代C++语法的话，适合去看老文章《&lt;a href="https://zhuanlan.zhihu.com/p/367309864" rel="noopener" target="_blank"&gt;基于C++11实现线程池&lt;/a&gt;》。&lt;/p&gt;&#10;&lt;p&gt;言归正传，在那篇老文章里有挺多网友提了一些&lt;code&gt;std::thread&lt;/code&gt;相关的问题。今天看了会cppreference，写了点代码实践了下，集中回答了一些问题，顺便水篇文章算是学习笔记了。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;h2 id="std-thread对象构建的新线程何时开始执行"&gt;&lt;a class="headerlink" href="#std-thread对象构建的新线程何时开始执行" title="std::thread对象构建的新线程何时开始执行"&gt;&lt;/a&gt;std::thread对象构建的新线程何时开始执行&lt;/h2&gt;&lt;p&gt;线程在构造关联的线程对象时立即开始执行，从提供给作为构造函数参数的顶层函数开始。&lt;/p&gt;&#10;&lt;p&gt;有几点需要注意：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;顶层函数的返回值将被忽略，而且若它以抛异常终止，则调用&lt;code&gt;std::terminate&lt;/code&gt;。在需要获取返回值时，顶层函数可以通过&lt;code&gt;std::promise&lt;/code&gt;或者修改共享变量（可能需要锁机制进行线程同步）。&lt;/li&gt;&#10;&lt;li&gt;当使用不带参数的默认构造函数&lt;code&gt;thread()&lt;/code&gt;构造&lt;code&gt;std::thread&lt;/code&gt;对象时，该对象不表示任何线程，也不会有新线程产生。&lt;/li&gt;&#10;&lt;li&gt;当时用移动构造函数&lt;code&gt;thread(thread&amp;amp;&amp;amp;other)&lt;/code&gt;构造&lt;code&gt;std::thread&lt;/code&gt;对象时，该对象会被构造为表示曾为&lt;code&gt;other&lt;/code&gt;所表示的执行线程的&lt;code&gt;std::thread&lt;/code&gt;对象。此调用后&lt;code&gt;other&lt;/code&gt;不再表示执行线程。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;std::thread&lt;/code&gt;对象不可复制（复制构造函数已被删除）。没有两个&lt;code&gt;std::thread&lt;/code&gt;对象会表示同一执行线程。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="std-thread对象构建新线程时可以传入什么东西作为参数"&gt;&lt;a class="headerlink" href="#std-thread对象构建新线程时可以传入什么东西作为参数" title="std::thread对象构建新线程时可以传入什么东西作为参数"&gt;&lt;/a&gt;std::thread对象构建新线程时可以传入什么东西作为参数&lt;/h2&gt;&lt;p&gt;&lt;code&gt;std::thread&lt;/code&gt;常用的构造函数如下：&lt;/p&gt;</description></item><item><title>Linux低延迟服务器调优</title><link>https://blog.skykey.systems/2022/01/27/Linux%E4%BD%8E%E5%BB%B6%E8%BF%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B0%83%E4%BC%98/</link><pubDate>Thu, 27 Jan 2022 14:01:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/01/27/Linux%E4%BD%8E%E5%BB%B6%E8%BF%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B0%83%E4%BC%98/</guid><description>&lt;h1 id="Linux低延迟服务器调优"&gt;&lt;a class="headerlink" href="#Linux低延迟服务器调优" title="Linux低延迟服务器调优"&gt;&lt;/a&gt;Linux低延迟服务器调优&lt;/h1&gt;&lt;h2 id="概述"&gt;&lt;a class="headerlink" href="#概述" title="概述"&gt;&lt;/a&gt;概述&lt;/h2&gt;&lt;p&gt;本文基于饶萌大佬的《Linux低延迟服务器系统调优》一文总结整理，自行补充了一些细节。大佬博文指路：&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://zhuanlan.zhihu.com/p/58669088" rel="noopener" target="_blank"&gt;Linux低延迟服务器系统调优&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;低延迟关键不在于低，而在于&lt;strong&gt;稳定&lt;/strong&gt;，稳定即可预期，可掌控，这对高频领域来说尤其重要。谈及Linux低延迟技术时，人们经常提到“Kernel Bypass”（内核旁路），即绕过内核，这是因为内核处理不仅慢且延迟不稳定。因此一个延迟要求很高的实时任务是不能触碰内核的，“避免触碰”是一个比Bypass更高的要求：不能以&lt;strong&gt;任何&lt;/strong&gt;方式进入内核。中断（Interrupt）是进入内核的方式之一，本文的关键点也在于避免关键线程被中断。即使中断发生时线程是空闲的，但重新回到用户态后CPU缓存被污染了，下一次处理请求的延迟也会变得不稳定。&lt;/p&gt;</description></item><item><title>Qt实现简易心跳包机制</title><link>https://blog.skykey.systems/2022/01/01/tcpheart/</link><pubDate>Sat, 01 Jan 2022 11:00:00 +0800</pubDate><guid>https://blog.skykey.systems/2022/01/01/tcpheart/</guid><description>&lt;h1 id="Qt实现简易心跳包机制"&gt;&lt;a class="headerlink" href="#Qt实现简易心跳包机制" title="Qt实现简易心跳包机制"&gt;&lt;/a&gt;Qt实现简易心跳包机制&lt;/h1&gt;&lt;p&gt;因为网络通信的不稳定性，在一些实时性、网络稳定性要求较高的情境下，我们需要一个实时检测客户端与服务端之间的连接状态和通信功能是否运行正常的机制，心跳包机制便是其中之一。接下来我会讲一下在之前的一个小项目中，利用Qt实现的简易心跳包检测机制。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;h2 id="架构"&gt;&lt;a class="headerlink" href="#架构" title="架构"&gt;&lt;/a&gt;架构&lt;/h2&gt;&lt;p&gt;&lt;img alt="客户端" decoding="async" loading="lazy" src="https://blog.skykey.systems/2022/01/01/tcpheart/%E5%AE%A2%E6%88%B7%E7%AB%AF.jpg"/&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="服务端" decoding="async" loading="lazy" src="https://blog.skykey.systems/2022/01/01/tcpheart/%E6%9C%8D%E5%8A%A1%E7%AB%AF.jpg"/&gt;&lt;/p&gt;&#10;&lt;p&gt;心跳包检测的原理是客户端定时向服务端发送心跳包，服务端收到心跳包后立即回复客户端。此间客户端检查心跳包是否发送成功以及是否超时。在一些实时性要求比较高的情境下，检测心跳包超时是有必要的。可以通过记录等待回复的心跳包数来实现检测心跳包超时。&lt;/p&gt;</description></item><item><title>当我谈线程池时我谈些什么</title><link>https://blog.skykey.systems/2021/12/12/%E5%BD%93%E6%88%91%E8%B0%88%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%97%B6%E6%88%91%E8%B0%88%E4%BA%9B%E4%BB%80%E4%B9%88/</link><pubDate>Sun, 12 Dec 2021 14:01:00 +0800</pubDate><guid>https://blog.skykey.systems/2021/12/12/%E5%BD%93%E6%88%91%E8%B0%88%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%97%B6%E6%88%91%E8%B0%88%E4%BA%9B%E4%BB%80%E4%B9%88/</guid><description>&lt;h1 id="当我谈线程池时我谈些什么"&gt;&lt;a class="headerlink" href="#当我谈线程池时我谈些什么" title="当我谈线程池时我谈些什么"&gt;&lt;/a&gt;当我谈线程池时我谈些什么&lt;/h1&gt;&lt;p&gt;最近跟着purecpp社区里的两篇博文复习了一下两种线程池的C++实现（单任务队列、多任务队列），相比于之前那篇C++11实现线程池的博文，语言版本进行了一点小更新（C++14-C++17）。在这里结合代码记录一下学习心得。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;12.12，然然首播一周年辣（嘉然小姐首播周年快乐）&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;h2 id="单任务队列线程池"&gt;&lt;a class="headerlink" href="#单任务队列线程池" title="单任务队列线程池"&gt;&lt;/a&gt;单任务队列线程池&lt;/h2&gt;&lt;p&gt;用现代的C++标准库（线程+锁+条件变量）实现一个单任务队列的线程池非常简单。就像之前那篇博文里面讲的一样，原理非常简单，对新手而言最复杂的其实就是C++11众多的新语言特性罢了。&lt;/p&gt;&#10;&lt;p&gt;一个简易的单任务队列线程池的实现思路：在线程池构造时初始化线程数，在析构时停止线程池。对外也只需要提供提交任务的接口就够了。&lt;/p&gt;&#10;&lt;h3 id="接口设计"&gt;&lt;a class="headerlink" href="#接口设计" title="接口设计"&gt;&lt;/a&gt;接口设计&lt;/h3&gt;&lt;h4 id="返回类型"&gt;&lt;a class="headerlink" href="#返回类型" title="返回类型"&gt;&lt;/a&gt;返回类型&lt;/h4&gt;&lt;pre class="legacy-code"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;explicit&lt;/span&gt; &lt;span class="title"&gt;ThreadPool&lt;/span&gt;&lt;span class="params"&gt;(&lt;span class="keyword"&gt;size_t&lt;/span&gt; threads = std::thread::hardware_concurrency())&lt;/span&gt;&lt;/span&gt;; &lt;span class="comment"&gt;// 构造函数&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="keyword"&gt;typename&lt;/span&gt; F, &lt;span class="keyword"&gt;typename&lt;/span&gt;... Args&amp;gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;auto&lt;/span&gt; &lt;span class="title"&gt;enqueue&lt;/span&gt;&lt;span class="params"&gt;(F &amp;amp;&amp;amp;f, Args &amp;amp;&amp;amp;...args)&lt;/span&gt;&lt;/span&gt;; &lt;span class="comment"&gt;// 入队接口&lt;/span&gt;&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;入队接口&lt;code&gt;enqueue()&lt;/code&gt;这个模板函数返回值使用了&lt;code&gt;auto&lt;/code&gt;关键字进行推导，实际上的返回值其实是一个future。future的类型如下：&lt;/p&gt;</description></item><item><title>C++日期与时间编程（C++11-C++17）</title><link>https://blog.skykey.systems/2021/05/19/C++%E6%97%A5%E6%9C%9F%E4%B8%8E%E6%97%B6%E9%97%B4%E7%BC%96%E7%A8%8B/</link><pubDate>Wed, 19 May 2021 11:44:17 +0800</pubDate><guid>https://blog.skykey.systems/2021/05/19/C++%E6%97%A5%E6%9C%9F%E4%B8%8E%E6%97%B6%E9%97%B4%E7%BC%96%E7%A8%8B/</guid><description>&lt;h1 id="C-日期与时间编程（C-11-C-17）"&gt;&lt;a class="headerlink" href="#C-日期与时间编程（C-11-C-17）" title="C++日期与时间编程（C++11-C++17）"&gt;&lt;/a&gt;C++日期与时间编程（C++11-C++17）&lt;/h1&gt;&lt;h2 id="0x00-导言"&gt;&lt;a class="headerlink" href="#0x00-导言" title="0x00 导言"&gt;&lt;/a&gt;0x00 导言&lt;/h2&gt;&lt;p&gt;日期和时间是在编程中常常接触到的东西，而C++也为程序员提供了强（复）大（杂）的日期和时间编程的相关支持。在C++20标准中，C++的&lt;code&gt;chrono&lt;/code&gt;库继C++11标准后也迎来了空前绝后大更新，但本文讨论的重点主要集中在C++11至C++17标准中日期和时间相关的内容，C++20标准中的&lt;code&gt;chrono&lt;/code&gt;新东西完全可以另开一个坑。&lt;/p&gt;</description></item><item><title>基于C++11实现线程池</title><link>https://blog.skykey.systems/2021/04/23/cpp11-thread-pool/</link><pubDate>Fri, 23 Apr 2021 19:10:44 +0800</pubDate><guid>https://blog.skykey.systems/2021/04/23/cpp11-thread-pool/</guid><description>&lt;h1 id="基于C-11实现线程池"&gt;&lt;a class="headerlink" href="#基于C-11实现线程池" title="基于C++11实现线程池"&gt;&lt;/a&gt;基于C++11实现线程池&lt;/h1&gt;&lt;h2 id="0x00-导入"&gt;&lt;a class="headerlink" href="#0x00-导入" title="0x00 导入"&gt;&lt;/a&gt;0x00 导入&lt;/h2&gt;&lt;p&gt;前些日子通过阅读几篇博客，大体学习了一下C++的并发编程（主要是多线程、异步部分）。手撸了一个多生产者-多消费者模型之后，最终觉得这也只是小打小闹而已，需要整个硬货。经过一番思考之后，手撸一个线程池貌似是一个非常合适的练习。线程池前前后后一共折腾了四五个小时左右，最令我意外的是——原本以为最难理解的并发部分反而是最简单的部分，线程池实现中大量的CPP11语法糖才是真正影响我理解的部分。经过三四个小时的阅读博文、查阅资料以及向大佬求教之后，我才真正对线程池实现有了比较深入地理解。“纸上得来终觉浅，绝知此事要躬行。”经历这一番折腾后才清楚地认识到了自己对CPP11理解的薄弱，遂写下这篇博客来总结自己对线程池实现以及所涉及到的CPP11语法糖的理解，方便自己以后再次阅读源码时有所考据。&lt;/p&gt;</description></item><item><title>C++并发编程</title><link>https://blog.skykey.systems/2021/04/22/C++%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/</link><pubDate>Thu, 22 Apr 2021 15:27:00 +0800</pubDate><guid>https://blog.skykey.systems/2021/04/22/C++%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/</guid><description>&lt;h1 id="C-Concurrency"&gt;&lt;a class="headerlink" href="#C-Concurrency" title="C++ Concurrency"&gt;&lt;/a&gt;C++ Concurrency&lt;/h1&gt;&lt;h2 id="0x00-概念"&gt;&lt;a class="headerlink" href="#0x00-概念" title="0x00 概念"&gt;&lt;/a&gt;0x00 概念&lt;/h2&gt;&lt;p&gt;CPP11标准以来，C++语言开始支持多线程模型。借助多线程模型，可以开发出更好的并发系统。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;h3 id="并发与并行"&gt;&lt;a class="headerlink" href="#并发与并行" title="并发与并行"&gt;&lt;/a&gt;并发与并行&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;并发(Concurrent)：如果多个队列可以交替使用某台咖啡机，则这一行为就是并发的。&lt;/li&gt;&#10;&lt;li&gt;并行(Parallel)：如果存在多台咖啡机可以被多个队列交替使用，则就是并行。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;img alt="img" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/a9fed9c82990ce0c.jpg" style="zoom:80%;"/&gt;&#10;&lt;p&gt;并发和并行都是在多任务的环境下的讨论。并行其实是并发的子集，他们的区别在于是否具有多个处理器。&lt;/p&gt;</description></item><item><title>MySQL on Qt (3):SQL的MVC结构基础知识总结</title><link>https://blog.skykey.systems/2020/07/24/mysqlonqt3/</link><pubDate>Fri, 24 Jul 2020 10:23:23 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/24/mysqlonqt3/</guid><description>&lt;h1 id="MySQL-on-Qt-3-SQL的MVC结构基础知识总结"&gt;&lt;a class="headerlink" href="#MySQL-on-Qt-3-SQL的MVC结构基础知识总结" title="MySQL on Qt (3): SQL的MVC结构基础知识总结"&gt;&lt;/a&gt;MySQL on Qt (3): SQL的MVC结构基础知识总结&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt; 写在前面： &lt;/p&gt;&#10;&lt;p&gt;大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气，每天晚睡早起撸代码，课都没听，很多知识都是现学现用。&lt;/p&gt;&#10;&lt;p&gt;为了避免当时学到的东西给全部忘光光（`_&amp;gt;`，我这脑子啊。。。），所以我把当时大作业的一些核心部分（一些零碎的小细节，能记就记）给记录一下，一方面是复习，一方面也方便以后用到的时候查阅。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Qt Model/View（模型/视图）结构（无师自通）</title><link>https://blog.skykey.systems/2020/07/23/model-view/</link><pubDate>Thu, 23 Jul 2020 16:26:13 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/23/model-view/</guid><description>&lt;h1 id="Qt-Model-View（模型-视图）结构（无师自通）"&gt;&lt;a class="headerlink" href="#Qt-Model-View（模型-视图）结构（无师自通）" title="Qt Model/View（模型/视图）结构（无师自通）"&gt;&lt;/a&gt;Qt Model/View（模型/视图）结构（无师自通）&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt;本文转载自：&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://c.biancheng.net/view/1864.html" rel="noopener" target="_blank"&gt;http://c.biancheng.net/view/1864.html&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Model/View（模型/视图）结构是 &lt;a href="http://c.biancheng.net/qt/" rel="noopener" target="_blank"&gt;Qt&lt;/a&gt; 中用界面组件显示与编辑数据的一种结构，视图（View）是显示和编辑数据的界面组件，模型（Model）是视图与原始数据之间的接口。&lt;/p&gt;</description></item><item><title>MySQL on Qt (2):SQL的连接、断开与增删查改基本操作</title><link>https://blog.skykey.systems/2020/07/23/mysqlonqt2/</link><pubDate>Thu, 23 Jul 2020 10:18:56 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/23/mysqlonqt2/</guid><description>&lt;h1 id="MySQL-on-Qt-2-SQL的连接、断开与增删查改基本操作"&gt;&lt;a class="headerlink" href="#MySQL-on-Qt-2-SQL的连接、断开与增删查改基本操作" title="MySQL on Qt (2): SQL的连接、断开与增删查改基本操作"&gt;&lt;/a&gt;MySQL on Qt (2): SQL的连接、断开与增删查改基本操作&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt;写在前面： &lt;/p&gt;&#10;&lt;p&gt;大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气，每天晚睡早起撸代码，课都没听，很多知识都是现学现用。&lt;/p&gt;&#10;&lt;p&gt;为了避免当时学到的东西给全部忘光光（`_&amp;gt;`，我这脑子啊。。。），所以我把当时大作业的一些核心部分（一些零碎的小细节，能记就记）给记录一下，一方面是复习，一方面也方便以后用到的时候查阅。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>MySQL on Qt (1):安装 MySQL 驱动以及连接 MySQL 与 SQLite</title><link>https://blog.skykey.systems/2020/07/22/mysqlonqt1/</link><pubDate>Wed, 22 Jul 2020 17:46:08 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/22/mysqlonqt1/</guid><description>&lt;h1 id="MySQL-on-Qt-1-安装-MySQL-驱动以及连接-MySQL-与-SQLite"&gt;&lt;a class="headerlink" href="#MySQL-on-Qt-1-安装-MySQL-驱动以及连接-MySQL-与-SQLite" title="MySQL on Qt (1): 安装 MySQL 驱动以及连接 MySQL 与 SQLite"&gt;&lt;/a&gt;MySQL on Qt (1): 安装 MySQL 驱动以及连接 MySQL 与 SQLite&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt;写在前面： &lt;/p&gt;&#10;&lt;p&gt;大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气，每天晚睡早起撸代码，课都没听，很多知识都是现学现用。&lt;/p&gt;&#10;&lt;p&gt;为了避免当时学到的东西给全部忘光光（`_&amp;gt;`，我这脑子啊。。。），所以我把当时大作业的一些核心部分（一些零碎的小细节，能记就记）给记录一下，一方面是复习，一方面也方便以后用到的时候查阅。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>About Me</title><link>https://blog.skykey.systems/2020/07/21/about/</link><pubDate>Tue, 21 Jul 2020 20:46:52 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/21/about/</guid><description>&lt;h2 id="Skykey"&gt;&lt;a class="headerlink" href="#Skykey" title="Skykey"&gt;&lt;/a&gt;Skykey&lt;/h2&gt;&lt;h3 id="Hello-World-👋"&gt;&lt;a class="headerlink" href="#Hello-World-👋" title="Hello,World! 👋"&gt;&lt;/a&gt;Hello,World! 👋&lt;/h3&gt;&lt;p&gt;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 &lt;a href="https://github.com/QtDocumentCN/QtDocumentCN" rel="noopener" target="_blank"&gt;QtDocCN&lt;/a&gt;. Besides programming, I like delicious food 🥗🥩🌮🍣 and doing sports 🏃⛹️‍♂️🏋🏼‍♂️.&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;p&gt;​ &lt;img align="right" alt="GIF" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/7e4c83e6741b88e8.gif"/&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Current Status Quo&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;👨🏻‍💻 I’m currently working on &lt;a href="https://github.com/QtDocumentCN/QtDocumentCN" rel="noopener" target="_blank"&gt;QtDocCN&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;🌱 I’m currently learning C++/Qt.&lt;/li&gt;&#10;&lt;li&gt;🤔 I hope to be a linux system development programmer. 🐧&lt;/li&gt;&#10;&lt;li&gt;💬 Ask me about anything and I would like to answer.&lt;/li&gt;&#10;&lt;li&gt;📫 Please email via &lt;a href="mailto:zcxzxlc@163.com"&gt;zcxzxlc@163.com&lt;/a&gt; to reach me.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr/&gt;&#10;&lt;p&gt;&lt;img alt="stats" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/26c3f2c84dc71ad4.svg"/&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="dino" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/ff66ad77d37f7bf1.gif"/&gt;&lt;/p&gt;</description></item><item><title>Linux下CMake使用</title><link>https://blog.skykey.systems/2020/07/21/cmake/</link><pubDate>Tue, 21 Jul 2020 11:44:17 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/21/cmake/</guid><description>&lt;h1 id="Linux下CMake使用方法"&gt;&lt;a class="headerlink" href="#Linux下CMake使用方法" title="Linux下CMake使用方法"&gt;&lt;/a&gt;Linux下CMake使用方法&lt;/h1&gt;&lt;p&gt;在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;编写 CMake 配置文件 CMakeLists.txt 。&lt;/li&gt;&#10;&lt;li&gt;执行命令 &lt;code&gt;cmake PATH&lt;/code&gt; 或者 &lt;code&gt;ccmake PATH&lt;/code&gt; 生成 Makefile 1 1&lt;code&gt;ccmake&lt;/code&gt; 和 &lt;code&gt;cmake&lt;/code&gt; 的区别在于前者提供了一个交互式的界面。。其中， &lt;code&gt;PATH&lt;/code&gt; 是 CMakeLists.txt 所在的目录。&lt;/li&gt;&#10;&lt;li&gt;使用 &lt;code&gt;make&lt;/code&gt; 命令进行编译。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;本文将从实例入手，一步步讲解 CMake 的常见用法，文中所有的实例代码可以在&lt;a href="https://github.com/wzpan/cmake-demo" rel="noopener" target="_blank"&gt;这里&lt;/a&gt;找到。如果你读完仍觉得意犹未尽，可以继续学习我在文章末尾提供的其他资源。&lt;/p&gt;</description></item><item><title>二元运算符重载</title><link>https://blog.skykey.systems/2020/07/21/%E4%BA%8C%E5%85%83%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD/</link><pubDate>Tue, 21 Jul 2020 11:43:20 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/21/%E4%BA%8C%E5%85%83%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD/</guid><description>&lt;h1 id="C-二元运算符重载"&gt;&lt;a class="headerlink" href="#C-二元运算符重载" title="C++ 二元运算符重载"&gt;&lt;/a&gt;C++ 二元运算符重载&lt;/h1&gt;&lt;p&gt;二元运算符需要两个参数，下面是二元运算符的实例。我们平常使用的加运算符（ + ）、减运算符（ - ）、乘运算符（ * ）和除运算符（ / ）都属于二元运算符。就像加(+)运算符。&lt;/p&gt;</description></item><item><title>构造函数</title><link>https://blog.skykey.systems/2020/07/21/%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0/</link><pubDate>Tue, 21 Jul 2020 11:41:50 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/21/%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0/</guid><description>&lt;h1 id="【C-】类构造函数（深拷贝与浅拷贝）"&gt;&lt;a class="headerlink" href="#【C-】类构造函数（深拷贝与浅拷贝）" title="【C++】类构造函数（深拷贝与浅拷贝）"&gt;&lt;/a&gt;【C++】类构造函数（深拷贝与浅拷贝）&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt;原创Jacky_Feng 最后发布于2019-11-29 19:56:28 阅读数 16 收藏&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="1-什么是类的构造函数"&gt;&lt;a class="headerlink" href="#1-什么是类的构造函数" title="1.什么是类的构造函数"&gt;&lt;/a&gt;1.什么是类的构造函数&lt;/h2&gt;&lt;p&gt;类的构造函数是类的一种特殊的成员函数，它会在每次创建类的新对象时被自动调用。没创建一个对象都必须调用一次构造函数。&lt;/p&gt;&#10;&lt;p&gt;构造函数的名称与类的名称是完全相同的，并且不会返回任何类型，也不会返回void。构造函数可用于为某些成员变量设置初始值。&lt;/p&gt;&#10;&lt;span id="more"&gt;&lt;/span&gt;&#10;&lt;p&gt;实例演示：&lt;/p&gt;&#10;&lt;pre class="legacy-code"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="keyword"&gt;using&lt;/span&gt; &lt;span class="keyword"&gt;namespace&lt;/span&gt; std;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="class"&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="title"&gt;Counter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="class"&gt;{&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;:&lt;/span&gt;&#10;&lt;span class="line"&gt; &lt;span class="comment"&gt;// 类Counter的构造函数&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt; &lt;span class="comment"&gt;// 特点：以类名作为函数名，无返回类型&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt; &lt;span class="built_in"&gt;Counter&lt;/span&gt;()&lt;/span&gt;&#10;&lt;span class="line"&gt; {&lt;/span&gt;&#10;&lt;span class="line"&gt; cout&amp;lt;&amp;lt;&lt;span class="string"&gt;"object is being created"&lt;/span&gt;&amp;lt;&amp;lt;endl;&lt;/span&gt;&#10;&lt;span class="line"&gt; }&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;:&lt;/span&gt;&#10;&lt;span class="line"&gt; &lt;span class="comment"&gt;// 数据成员&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt; &lt;span class="keyword"&gt;int&lt;/span&gt; m_value;&lt;/span&gt;&#10;&lt;span class="line"&gt;};&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="function"&gt;&lt;span class="keyword"&gt;int&lt;/span&gt; &lt;span class="title"&gt;main&lt;/span&gt;&lt;span class="params"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="function"&gt;&lt;/span&gt;{&lt;/span&gt;&#10;&lt;span class="line"&gt;&#9;Counter obj1;&lt;/span&gt;&#10;&lt;span class="line"&gt;&#9;&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;;&lt;/span&gt;&#10;&lt;span class="line"&gt;}&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;以上代码编译和执行的结果如下：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;object is being created&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>欧拉筛法</title><link>https://blog.skykey.systems/2020/07/21/euler-prime/</link><pubDate>Tue, 21 Jul 2020 11:40:14 +0800</pubDate><guid>https://blog.skykey.systems/2020/07/21/euler-prime/</guid><description>&lt;h1 id="欧拉筛法"&gt;&lt;a class="headerlink" href="#欧拉筛法" title="欧拉筛法"&gt;&lt;/a&gt;欧拉筛法&lt;/h1&gt;&lt;blockquote&gt;&#10;&lt;p&gt;原创程画 最后发布于2018-05-15 18:24:08 阅读数 4146 收藏&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;想看欧拉筛法的可直接拉到最后。&lt;/p&gt;&#10;&lt;p&gt;相信各位对素数并不陌生，素数就是指不能被除了1和自身以外的别的数整除的数，比如2,3,5，而且根据欧几里得的证明来看，素数是无限的，普通的筛选素数的方法可能对较小的数据能在较短时间内完成筛选，但对于很大的数据（比如1e9）就会花费很长的时间。&lt;/p&gt;</description></item><item><title>关于</title><link>https://blog.skykey.systems/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.skykey.systems/about/</guid><description>&lt;h2 id="Skykey"&gt;&lt;a class="headerlink" href="#Skykey" title="Skykey"&gt;&lt;/a&gt;Skykey&lt;/h2&gt;&lt;h3 id="Hello-World-👋"&gt;&lt;a class="headerlink" href="#Hello-World-👋" title="Hello,World! 👋"&gt;&lt;/a&gt;Hello,World! 👋&lt;/h3&gt;&lt;p&gt;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 &lt;a href="https://github.com/QtDocumentCN/QtDocumentCN" rel="noopener" target="_blank"&gt;QtDocCN&lt;/a&gt;. Besides programming, I like delicious food 🥗🥩🌮🍣 and doing sports 🏃⛹️‍♂️🏋🏼‍♂️.&lt;/p&gt;&#10;&lt;p&gt;​ &lt;img align="right" alt="GIF" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/7e4c83e6741b88e8.gif"/&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Current Status Quo&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;👨🏻‍💻 I’m currently working on &lt;a href="https://github.com/QtDocumentCN/QtDocumentCN" rel="noopener" target="_blank"&gt;QtDocCN&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;🌱 I’m currently learning C++/Qt.&lt;/li&gt;&#10;&lt;li&gt;🤔 I hope to be a linux system development programmer. 🐧&lt;/li&gt;&#10;&lt;li&gt;💬 Ask me about anything and I would like to answer.&lt;/li&gt;&#10;&lt;li&gt;📫 Please email via &lt;a href="mailto:zcxzxlc@163.com"&gt;zcxzxlc@163.com&lt;/a&gt; to reach me.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr/&gt;&#10;&lt;p&gt;&lt;img alt="stats" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/26c3f2c84dc71ad4.svg"/&gt;&lt;/p&gt;</description></item><item><title>归档</title><link>https://blog.skykey.systems/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.skykey.systems/archives/</guid><description/></item><item><title>搜索</title><link>https://blog.skykey.systems/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.skykey.systems/search/</guid><description/></item><item><title>友情链接</title><link>https://blog.skykey.systems/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.skykey.systems/links/</guid><description>&lt;div class="post-body"&gt;&#10;&lt;div id="links"&gt;&#10;&#10;&lt;div class="links-content"&gt;&#10;&lt;div class="link-navigation"&gt;&#10;&lt;div class="card"&gt;&#10;&lt;aside class="missing-image"&gt;原图暂不可用：avatar.jpg &lt;a href="https://www.cryfeifei.cn/medias/avatar.jpg"&gt;查看原始链接&lt;/a&gt;&lt;/aside&gt;&#10;&lt;div class="card-header"&gt;&#10;&lt;div&gt;&#10;&lt;a href="https://www.cryfeifei.cn" rel="noopener" target="_blank"&gt;张小飞&lt;/a&gt;&#10;&lt;/div&gt;&#10;&lt;div class="info"&gt;WPS开发者&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="card"&gt;&#10;&lt;img class="ava" decoding="async" loading="lazy" src="https://blog.skykey.systems/media/792cc976aca3e0dc.jpg"/&gt;&#10;&lt;div class="card-header"&gt;&#10;&lt;div&gt;&#10;&lt;a href="https://sakura1943.github.io/sakunia-blog/" rel="noopener" target="_blank"&gt;Sakunia&lt;/a&gt;&#10;&lt;/div&gt;&#10;&lt;div class="info"&gt;前途可期&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="card"&gt;&#10;&lt;img alt="" class="ava" decoding="async" loading="lazy" src="https://blog.skykey.systems/avatar-placeholder.svg"/&gt;&#10;&lt;div class="card-header"&gt;&#10;&lt;div&gt;&#10;&lt;a href="https://tsaitang.com" rel="noopener" target="_blank"&gt;采唐&lt;/a&gt;&#10;&lt;/div&gt;&#10;&lt;div class="info"&gt;采唐的垃圾堆&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item></channel></rss>