- 博客(18)
- 资源 (21)
- 收藏
- 关注
原创 基于C++11实现线程池
为何需要线程池那么为什么我们需要线程池技术呢?多线程编程用的好好的,干嘛还要引入线程池这个东西呢?引入一个新的技术肯定不是为了装酷,肯定是为了解决某个问题的,而服务端一般都是效率问题。我们可以看到多线程提高了CPU的使用率和程序的工作效率,但是如果有大量的线程,就会影响性能,因为要大量的创建与销毁,因为CPU需要在它们之间切换。线程池可以想象成一个池子,它的作用就是让每一个线程结束后,并不会销毁,而是放回到线程池中成为空闲状态,等待下一个对象来使用。C++中的线程池但是让人遗憾的是,C++并没有在语
2021-07-30 00:22:42 694
原创 Windows的网络模型
windows提供了六种网络通信模型:阻塞模型、选择模型、异步选择模型、事件选择模型、重叠I/O模型、IOCP模型。异步通信同步通信IOCP原理IOCP包括三个部分:完成端口(存放重叠的I/O请求),客户端请求的处理,等待线程队列(一定数量的工作者线程,一般采用CPU*2个)线程池中的工作线程的数量与CPU内核数量相同,用它来最小化线程切换代价。一个IOCP对象,在操作系统中可关联着多个socket和文件控制端。IOCP对象内部有一个先进先出(FIFO)队列,用于存放IOCP所关联的输入输出
2021-07-28 00:01:47 1446 2
原创 C++ rb_tree红黑树
在 STL 编程中,容器是我们经常会用到的一种数据结构,容器分为序列式容器和关联式容器。两者的本质区别在于:序列式容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器则是通过键 (key) 存储和读取元素。本篇着重剖析关联式容器相关背后的知识点,来一张思维导图容器分类前面提到了,根据元素存储方式的不同,容器可分为序列式和关联式,那具体的又有哪些分类呢,这里我画了一张图来看一下。关联式容器比序列式容器更好理解,从底层实现来分的话,可以分为 RB_tree 还是 hash_table,所有暴
2021-07-25 23:57:16 813 5
原创 STL 迭代器与 traits 编程技法
在 STL 编程中,容器和算法是独立设计的,容器里面存的是数据,而算法则是提供了对数据的操作,在算法操作数据的过程中,要用到迭代器,迭代器可以看做是容器和算法中间的桥梁。迭代器设计模式为何说迭代器的时候,还谈到了设计模式?这个迭代器和设计模式又有什么关系呢?在设计模式中,关于 iterator 的描述如下:一种能够顺序访问容器中每个元素的方法,使用该方法不能暴露容器内部的表达方式。而类型萃取技术就是为了要解决和 iterator 有关的问题的。在 C++ 语言里面,我们可用以下方式来简单区分一下
2021-07-24 18:26:50 110
原创 C++ 模板
C++模版的诞生程序本质是数据结构+算法,任何一门语言都可以这样理解,这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的“E=MC^2”——一个公式展示出了程序的本质。最初C++是没有标准库的,任何一门语言的发展都需要标准库的支持,为了让C++更强大,更方便使用,Bjarne Stroustrup觉得需要给C++提供一个标准库,但标准库设计需要一套统一机制来定义各种通用的容器(数据结构)和算法,并且能很好在一起配合,这就需要它们既要相对的独立,又要操作接口保持统一,而且能够很容易被别人使用(用到实
2021-07-22 00:16:02 343 5
原创 C++11多线程
线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的本质都相当于多个人去合伙完成一件事。多线程并发:多线程是实现并发(双核的真正并行或者单核机器的任务切换都叫并发)的一种手段,多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行。C++多线程并发: (简单情况下)实现C++多线程并发程序的思路如下:将任
2021-07-21 23:37:10 449
原创 STL 配置器(allocator)
配置器:负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。空间配置器:整个 STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以存放内容。什么是 allocator?allocator 有什么用?我们需要对 C++ 的 allocator 的堆内存接口调用顺序有个清晰的认识,如下图所示。allocator 堆内存管理接口 STL 的容器(eg: vector、stack、deque等)有一个共同特征,就是
2021-07-21 22:12:01 1121 3
原创 C++11随机数
在C++11之前,现有的随机数函数都存在一个问题:在利用循环多次获取随机数时,如果程序运行过快或者使用了多线程等方法,srand((unsigned)time(null))这样的设置当前系统时间为种子的方法每次返回的随机数都是一样的。而C++11中提供了真随机数做种子的方法来解决这一问题。random_device标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现是用rand_s,使用的是操作系统来生成加密安全的伪随机数随机数生成
2021-07-21 00:34:44 1593
原创 C++处理日期和时间的chrono库
C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono 库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。时间间隔 duration常用类成员duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration 的原型如下:// 定义于头文件 <chrono>template< class Rep,
2021-07-18 18:13:35 1664 2
原创 C++数值类型和字符串之间的转换
在 C++11 中提供了专门的类型转换函数,程序猿可以非常方便的使用它们进行数值类型和字符串类型之间的转换。数值转换为字符串使用 to_string() 方法可以非常方便地将各种数值类型转换为字符串类型,这是一个重载函,函数声明位于头文件 中,函数原型如下:// 头文件 <string>string to_string (int val);string to_string (long val);string to_string (long long val);string to_
2021-07-18 17:29:57 434
原创 VS Code 修改用户配置的目录,防止C盘用户数据丢失
创建VS Code的快捷方式目标内指定用户配置的目录“D:\soft\VSCode\Microsoft VS Code\Code.exe” --user-data-dir “User Data”这里指定为VS Code同级目录下的User Data文件夹
2021-07-16 11:39:52 998
原创 Chrome浏览器指定用户数据的保存路径
这里将用户数据放到Chrome浏览器的当前目录我现在的浏览器路径是 D:\soft\Chrome\Application\chrome.exe选中它右键发送桌面快捷方式,将快捷方式剪切到chrome.exe同一目录右击快捷方式修改目标D:\soft\Chrome\Application\chrome.exe --user-data-dir=“User Data”–user-data-dir参数就是指定用户数据的存放目录,这里指定为当前目录的User Data文件夹然后用快捷方式打开浏览器就行了,
2021-07-16 09:57:50 5005
原创 qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““
在 QApplication a(argc, argv); 之前设置环境变量 QByteArray qtdir = qgetenv("QTDIR"); /*QString strDir = "D:\\Qt\\myDebugQt\\myDebugQt";*/ QString strPlatforms = qtdir + QString(R"(\plugins\platforms)"); qputenv("QT_QPA_PLATFORM_PLUGIN_PATH", strPlatforms.toLoca
2021-07-14 16:34:25 356
原创 C++右值引用
右值C++11增加了一个新的类型,称为右值引用(R-value reference),标记为&&。在介绍右值引用类型之前要了解什么是左值和右值。lvalue是loactor value的缩写,rvalue是read value的缩写左值是指存储在内存中、有明确存储地址(可取地址)的数据右值是指可以提供数据值的数据(不可取地址)通过描述可以看出,区分左值和右值的便捷方法是:可以对表达式取地址(&)就是左值,否则就是右值。所有有名字的变量或对象都是左值,而右值是匿名的。右
2021-07-13 00:20:17 2318 1
原创 C++11基础特性
初始化列表C++11 添加了 initializer_list 类型,允许使用 initializer_list 初始化对象STL 容器例如 map, vector 等都实现了 initalizer_list constructor自定义的对象也可以使用 initalizer_list 作为构造函数的参数class CVector{private: std::vector<int> m_vec;public: CVector() {} CVector(const std
2021-07-02 00:03:50 206 2
转载 结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需要占用int长度空间,空数组不占任何空间。“这个数组不占用任何内存”,意味着这样的结构节省空间;“该数组的内存地址就和它后面的元素地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用。这样的写法最适合制作动态buffer,因为可以这样分配空间malloc(sizeof(structXXX)
2021-07-01 00:11:46 488
转载 C/C++中switch用法的一种替换方式
在C/C++中,switch语句是经常被用到的,当switch内的case语句较多时程序有时显得比较繁乱,此种情况下可以用另外一种实现方式替代switch。详细用法见例子:#include "stdafx.h" float AddFunc(float a, float b){ return (a + b);} float SubFunc(float a, float b){ return (a - b);} float MultiplyFunc(float a, float b)
2021-07-01 00:09:49 946
转载 VS自带工具:dumpbin的使用查看Lib,dll等
有时候我们想查看一个exe引用了哪些动态库,或者我们想看某个动态库包含哪些接口函数,这个时候可以使用dumpbin.exe工具:1.输入Dumpbin -imports calldll.exe查看它的输入信息,可以看到它加载了**.dll2.输入dumpbin –exports dlltest.dll,列出导出函数*开始->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools ->“Visual Studio 命令提示(
2021-07-01 00:00:52 730
WinDbg_preview_1.1910.3003.0.zip
2021-10-10
activemq-cpp编译出来的所有库包括openssl,cppunit,apr
2021-01-03
QT Player Demo
2020-12-02
PE格式解析.zip
2020-09-09
二维码识别zbar.zip
2020-04-12
botan版本2.3.0.zip
2020-04-12
WIN10-PCHunter64.zip
2020-04-05
Qt中文文档.zip
2020-04-01
二维码本地识别.zip
2020-03-27
Windows,JAVA,Android的API文档.zip
2020-03-22
Qt5.13.0 Https库.zip
2019-10-15
qrencode.zip
2019-10-07
botan-2.1.0.zip
2019-10-07
globalshortcut.zip
2019-10-04
Winhex 19.8 中文版
2019-04-28
win7,win10注入CSRSS 不蓝屏
2019-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人