最新
思路思路首先连接池做的就是管理连接的作用
而用户需要的是连接
我们就是管理连接并且提供连接的过程
所以我们围绕的是 getconnection,如何让用户获得一个连接。
目的目的原本的 mysql 的 api 或者封装的 mysql 类,都可以建立连接,为什么要做一个连接池来管理呢?
因为大量的用户连接请求会导致大量的连接创建和销毁,消耗资源,所以就想能不能优化这一部分?
其中大量的连接是重复的,是可以被重新调用访问数据库的。也就是说很多是不需要销毁的,如果恰好够用且不销毁,那么就不会大量创建,所以其中创建和销毁是重复的。
所以整个的数据库连接池就是为了提升效率,减少重复的冗余操作。
整个 mysql 结构图整个 mysql 结构图
单例设计思路单例设计思路单例推荐采用的是 c++11 支持的性质:”在 C++中,函数内部可以声明静态局部变量。这些变量在函数第一次执行到它们的声明时进行初始化,并且在程序的整个运行期间保持它们的值,即使函数已经返回。每次函数被调用时,这些变量都会保持它们上一次调用结束时的状态。”
也就是说,只要被执行一次,那么就会初始化,且只初始化一次。
所以也引出我们 ...
Socket
未读主线是什么主线是什么首先为什么需要我们的网络多路复用,阻塞和非阻塞,因为我们需要考虑效率,而客户端和服务端一对一通信显然是不会陷入效率问题,而真正会产生效率问题是因为我们的多线程处理并发的场景,因此主线就是多线程中的主线程和子线程
阻塞在阻塞什么阻塞在阻塞什么函数分析我们不妨分析一下所有的 socket 函数,看看什么适合主线程,什么适合子线程。首先 socket 函数创建的是一个 sock 结构体,交给内核管理然后是 bind 函数给 sock 绑定 ip 和端口之后是 listen 函数初始化半连接队列和全连接队列,并且初始化 sock 状态再然后是 accept 函数从全连接队列中获取 sock 的 fdRecv 函数通过这个 fd 获得 sock 中缓冲区的内容,并加以处理Send 函数通过 fd 获得 sock 中缓冲区的位置,并开始写,又由内核发送
哪些阻塞?
socket():这个函数用于创建一个新的 socket,这个过程通常是非阻塞的。
bind():这个函数用于将 socket 绑定到一个特定的 IP 地址和端口号,这个过程也是非阻塞的。
listen():这个 ...
前言前言本文记录关于我这一年的学习情况,大多数以obsidian的笔记作为主线,希望通过这条主线快速地回顾这一年的进程。
回顾回顾2023
04-10
CSAPP
05-7
数据结构
08-10
侯捷面向对象
09-18
c++ Primer
09-25
侯捷STL源码剖析
10-1
Effective modern C++
10-20
Effective C++
11-10
计算机网络
11-25
More effective c++
12-05
拥有第一个博客
12-13
拥有第二个博客
12-23
CS144
12-30
git学习
2024
1-7
CMake学习
1-7
图论
心里话心里话回顾这一年我感觉学得是挺多的,但是很多的书籍仍然需要去沉淀,慢慢挖掘其中的深邃。然后对于平时,个人感觉也是挺水的,如果多努力一点可能能对知识掌握更深更广。希望24年能更好的努力吧,项目是一个没做,太卢瑟了,加油加油!
CMake
未读前言前言这部分是关于如何入门地通过cmake使用opencv
实践实践首先你需要在文件下创建:main.cpp 的源码如下
1234567891011121314151617181920212223242526272829303132333435363738394041#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; int main(){ Mat srcImg = imread(".jpg"); // 尝试读取图片 if (srcImg.empty()) { // 检查图片是否正确载入 cerr << "Error: Image cannot be loaded!" << endl; return -1; } string windowName = "Image Displ ...
CMake
未读前言前言本文只是关于如何配置他人已经包装好的软件配置路径。由于每一个电脑的安装路径都不一样,所以如果为了保证 CMakelists.txt 可以在其他电脑上复用,需要用到环境变量,代替曾经用绝对路径的情况
配置配置配置需要通过 find_package(OpenCV REQUIRED) 到环境变量中从上到下依次寻找路径,找到便退出。
在我们的 xxx.cmake 中会有关于如何设置 CMakelists.txt 的配置例如 OpenCV 的 OpenCVConfig.cmake :
将他们找到,然后注意三个部分,find_package 找到路径 add_executable 写可执行文件 target_include_directories 链接头 target_link_libraries 链接库
1234567find_package(OpenCV REQUIRED)add_executable(lesson4_opencv main.cpp)target_include_directories(lesson4_opencv PRIVATE ${OpenCV_INCL ...
CMake
未读
指令
描述
推荐
备注
include_directories
在构建目标之前,为所有的目标添加头文件搜索路径。
非 target-specific,会影响整个 CMake 项目的所有目标。
target_include_directories
为特定的构建目标添加头文件搜索路径。
✅
target-specific,只影响指定的目标。
link_directories
在构建目标之前,添加库文件搜索路径。
非 target-specific,会影响之后定义的所有目标。但通常不推荐使用,因为它不提供精确的依赖关系。
target_link_libraries
为特定的构建目标链接一个或多个库。
✅
target-specific,只影响指定的目标,并且可以指定私有(PRIVATE)、接口(INTERFACE)或公共(PUBLIC)链接。
add_definitions
添加编译器定义(如预处理器定义)。
非 target-specific,会影响整个 CMake 项目的所有目标。
target_compile_definitions
为特定目标 ...
前言前言这节课中的依赖是狭义的认为不需要提供的库不链接,换一句话说只有当前库中有调用另一个库的函数那么构成依赖。
预览做法是将源代码文件(在这个案例中是 .cpp 文件,对于 C 项目将是 .c 文件)编译并打包成库文件。然后添加访问权级,让库可以被其他部分的项目代码链接和使用。Cmake 权级如下:
范围
目标构建时
链接目标时
描述
PRIVATE
是
否
目标私有,库或路径仅用于构建当前目标,在当前目标的外部不可见。
INTERFACE
否
是
目标接口,用于目标接口的库或路径不直接用于构建目标,但会传递给链接此目标的其他目标。
PUBLIC
是
是
两者兼而有之,库或路径用于构建当前目标,且会传递给任何链接了该目标的其他目标。
课程文件课程文件以下是(比飞鸟贵重的多_HKL)up 教程里的各个文件代码add.hh
12#pragma onceint add(int a, int b);
add.cpp
12345678910#include "common.h"int add(int x, int y){ ...
前言 :前言 :通过之前的文章应该了解到 linux 系统和 win 系统对于构建 cpp 文件的差别也是很大的。这里补充一下执行文件的不同之处:
CMake在linux和win的运行执行文件不同之处CMake在linux和win的运行执行文件不同之处Linux 的优点Linux 下是有保存同级 CMakelists.txt 的 target_link_libraries 路径而 windows 是没有保存路径的 .exe 必须要配合 .dll 文件,linux 的可执行文件是可以自寻路径的
Windows 搜索路径通过隐式和显式链接,Windows 首先搜索“已知 DLL”,如 Kernel 32. Dll 和 User 32. Dll。Windows 然后按下列顺序搜索 DLL:
当前进程的可执行模块所在的目录。
当前目录。
Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。
Windows 目录。GetWindowsDirectory 函数检索此目录的路径。
PATH 环境变量中列出的目录。
Linux 搜索路径Linux 搜索路径Li ...
前言前言相比较于静态库,动态库需要的是得到一些运行时的量,这是和静态库本质的区别
实现动态库实现动态库
确认平台
我们配置动态库要注意是在什么平台下,如果是在 win 下需要有静态库作为帮手,把动态库导入
Windows 和 Linux 在处理静态库和动态库(也称为共享库)时有一些差异,这主要归因于它们的链接和加载机制的不同。这些差异影响了在各自平台上构建和运行程序的方式。
Windows 平台:Windows 平台:
静态库(. Lib):
在 Windows 上,静态库通常以 .lib 文件形式出现。
当程序编译时,静态库的内容被复制到最终的可执行文件(.exe)中。
因此,部署时不需要静态库文件,因为所有必需的代码都包含在 .exe 文件内。
动态链接库(DLL,. Dll):
动态链接库(Dynamic Link Libraries, DLLs)是 Windows 上的共享库。
程序在运行时动态地链接到这些库,而不是在编译时。
这意味着,为了运行程序,必须有相应的 .dll 文件在可访问的路径上,例如程序所在目录或系统目录。
在 Windows 上,有时即使 ...
前言前言我们知道 c.cpp c. hh 两个文件会经过编译,然后生成机器码文件,而静态库的作用就是保存机器码,一方面是保证了安全性,另一方面是不用再次编译(但是跨平台肯定是不行的)
如何生成静态库如何生成静态库add_library(静态库名字 STATIC 静态库.cpp文件)add_library(add_static STATIC add.cpp)
静态库的完整过程静态库的完整过程
编译 add.cpp 生成静态库: 当通过命令添加一个库时,CMake 会为适用的源文件生成一个编译指令 add_library(add_static STATIC add.cpp)。在这种情况下,它将 add.cpp 编译文件并创建一个名为 add_static 的静态库(在 Windows 上通常是 add_static.lib,在 Unix-like 系统中是 libadd_static.a)。
编译 main.cpp 生成对象文件: add_executable(main main.cpp) 命令告诉 CMake 对 main.cpp 文件进行编译,生成一个对象文件 main.o( 或 m ...