Skykey's Home

Skykey的私人博客ᕕ( ᐛ )ᕗ

基于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
阅读全文 »

C++ Concurrency

0x00 概念

CPP11标准以来,C++语言开始支持多线程模型。借助多线程模型,可以开发出更好的并发系统。

阅读全文 »

MySQL on Qt (3): SQL的MVC结构基础知识总结

写在前面:

大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。

为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。

这篇文章是大作业 MySQL + SQLite 操作相关部分的第三章,主要讲一下 Qt 中 SQL 的 MVC 结构的基础知识,包括一部分的 MVC 原理介绍和基础使用。

阅读全文 »

Qt Model/View(模型/视图)结构(无师自通)

本文转载自:

http://c.biancheng.net/view/1864.html

Model/View(模型/视图)结构是 Qt 中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。

GUI 应用程序的一个很重要的功能是由用户在界面上编辑和修改数据,典型的如数据库应用程序。数据库应用程序中,用户在界面上执行各种操作,实际上是修改了界面组件所关联的数据库内的数据。

将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据的一种较好的方式。Qt 使用 Model/View 结构来处理这种关系,Model/View 的基本结构如图 1 所示。

Model/View基本结构

阅读全文 »

MySQL on Qt (2): SQL的连接、断开与增删查改基本操作

写在前面:

大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。

为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。

这篇文章是大作业 MySQL + SQLite 操作相关部分的第二章,主要讲一下 Qt 中 MySQL 和 SQLite 连接、断开与增删查改的基本操作。

阅读全文 »

MySQL on Qt (1): 安装 MySQL 驱动以及连接 MySQL 与 SQLite

写在前面:

大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。

为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。

这篇文章是大作业 MySQL + SQLite 操作相关部分的第一章,主要讲一下如何安装 MySQL 驱动(Win 下)以及如何连接 MySQL 及 SQLite。

阅读全文 »

Linux下CMake使用方法

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CMake 配置文件 CMakeLists.txt 。
  2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 1 1ccmakecmake 的区别在于前者提供了一个交互式的界面。。其中, PATH 是 CMakeLists.txt 所在的目录。
  3. 使用 make 命令进行编译。

本文将从实例入手,一步步讲解 CMake 的常见用法,文中所有的实例代码可以在这里找到。如果你读完仍觉得意犹未尽,可以继续学习我在文章末尾提供的其他资源。

阅读全文 »

C++ 二元运算符重载

二元运算符需要两个参数,下面是二元运算符的实例。我们平常使用的加运算符( + )、减运算符( - )、乘运算符( * )和除运算符( / )都属于二元运算符。就像加(+)运算符。

下面的实例演示了如何重载加运算符( + )。类似地,您也可以尝试重载减运算符( - )和除运算符( / )。

阅读全文 »

【C++】类构造函数(深拷贝与浅拷贝)

原创Jacky_Feng 最后发布于2019-11-29 19:56:28 阅读数 16 收藏

1.什么是类的构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时被自动调用。没创建一个对象都必须调用一次构造函数。

构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void。构造函数可用于为某些成员变量设置初始值。

阅读全文 »

欧拉筛法

原创程画 最后发布于2018-05-15 18:24:08 阅读数 4146 收藏

想看欧拉筛法的可直接拉到最后。

相信各位对素数并不陌生,素数就是指不能被除了1和自身以外的别的数整除的数,比如2,3,5,而且根据欧几里得的证明来看,素数是无限的,普通的筛选素数的方法可能对较小的数据能在较短时间内完成筛选,但对于很大的数据(比如1e9)就会花费很长的时间。

阅读全文 »