自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 多线程进阶——线程池的实现

池化技术是一种资源管理策略,它通过重复利用已存在的资源来减少资源的消耗,从而提高系统的性能和效率。在计算机编程中,池化技术通常用于管理线程、连接、数据库连接等资源。我们会将可能使用的资源预先创建好,并且将它们创建在一个池中,当需要使用这些资源时,直接从池中获取,使用完毕后再将它们归还到池中,而不是每次都创建和销毁资源。池化技术的引用场景十分广泛,例如线程池、数据库连接池、对象池等,今天我们主要要探讨的就是线程池。

2024-10-24 19:16:20 967

原创 多线程拓展—— RAII与 智能指针

在前面的章节中,我们介绍了多线程编程中的基本概念,包括线程的创建、同步、互斥等。在锁的介绍那篇文章中我们介绍了锁的包装器与lock_guard,它们都是基于RAII(Resource Acquisition Is Initialization)原则的智能指针。RAII是一种编程范式,它使用对象的生命周期来管理资源的分配和释放。在多线程编程中,RAII可以有效地避免资源泄露和死锁等问题。而这篇文章我们将从RAII开始,探究c++11后内存管理的一些新特性.

2024-10-10 22:57:31 662

原创 多线程实践(一)——# 基于多线程实现的并发服务器

【代码】多线程实践(一)——# 基于多线程实现的并发服务器。

2024-10-08 00:16:45 443

原创 c++进阶篇——初窥多线程(五) 条件变量与信号量

条件变量是线程间同步的一种机制,它允许一个或多个线程在某些条件满足时被唤醒,从而继续执行。condition-variable:提供与 std::unique_lock关联的条件变量condition_variable_any:提供与任何锁类型关联的条件变量两者的主要区别在于,condition_variable_any可以凭借来与任何类型的锁一起使用,而condition_variable只能与std::mutex一起使用。

2024-10-06 19:35:31 952

原创 c++进阶篇——初窥多线程(四) 线程同步的概念以及锁

线程同步是指多个线程在执行过程中,由于共享资源,导致数据不一致的问题。i

2024-10-04 12:05:14 892

原创 进程通信——内存映射

有关进程的教学部分就以此告一段落,大家如果多其他的部分感兴趣,可以参考我的博客网站。

2024-10-02 22:38:08 786

原创 进程通信方式——管道

管道是进程间通信的一种方式,它的本质其实是内核中的一块内存(或者说是内核缓冲区),这块区域的数据存储在一个环形队列,不过由于管道使用的是内核里面 的内存,所以我们无法对管道里面的数据进行直接操作,只能在管道的两端读/写数据。

2024-09-30 22:56:10 826

原创 go语言后端开发学习(七)——如何在gin框架中集成限流中间件

上面就是一些常见的限流策略,虽然说现在限流策略已经不再是单体架构而是迈向分布式,但是万变不离其宗,主要还是基于上面所说的策略进行拓展李文周博客——常用限流策略——漏桶与令牌桶介绍。

2024-09-14 23:55:17 1065

原创 数学建模赛前备赛——模拟退火算法

智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优,常见的只能优化算法有很多,比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。

2024-08-29 00:18:45 1412

原创 redis学习笔记 ——redis中的四大特殊数据结构

Bitmap(位图),是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素,通过对最小单位bit进行0|1的设置来表示某个元素的值或者状态,由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

2024-08-28 01:21:07 1121

原创 redis实战——go-redis的使用与redis基础数据类型的使用场景(二)

缓存对象做购物车首先是缓存对象,hash命令中的keyvaluefiled很好的能够对应对象的结构我们可以利用Hash来缓存结构,比如像下面我写了一个json那购物车我们应该怎么做呢?

2024-08-23 17:51:37 758

原创 redis实战——go-redis的使用与redis基础数据类型的使用场景(一)

在之前的文章我们介绍了redis的五大基础数据结构以及一些操作这些数据结构,而用原生命令在我们日常开发的过程中当然是不可能的,本文我们所要探究的就是如何基于go语言实现对redis数据库的操作以及不同的数据结构所使用的场景。

2024-08-22 21:21:06 878

原创 redis学习笔记——redis中的常见数据类型以及相关命令

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

2024-08-20 00:20:40 1022

原创 go语言后端开发学习(六) ——基于雪花算法生成用户ID

本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。

2024-08-14 17:26:28 989

原创 go语言后端开发学习(五)——如何在项目中使用Viper来配置环境

Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML 等

2024-08-13 16:27:17 1328

原创 go语言后端开发学习(四) —— 在go项目中使用Zap日志库

本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法

2024-08-11 20:14:32 1009

原创 c++网络编程实战——开发基于协议的文件传输模块(一)如何实现一个简单的tcp长连接

我们知道tcp在建立连接的时候会通过三次握手与四次挥手来建立tcp连接,而服务端与客户端之间的工作流程一般是这样的:它的工作流程如下:1.客户端向服务端发送连接请求2.服务端接收客户端连接请求3.二者之间相互发送报文实现数据的传输4.断开连接这种一完成数据交换就断开连接的通讯方式我们称为tcp的短连接。那么现在问题来了:客户端与服务端连接是需要时间的,同时是否可以立即连接上是不确定的(如果现在服务端可连接的客户端已达到上限),如果我们希望让客户端与服务端始终保持连接状态,应该怎么办呢?

2024-08-03 18:03:41 896

原创 c++网络编程实战——开发基于ftp协议的文件传输模块(三) 封装自己的ftp客户端

经过上面的步骤我们就基于开源库实现了一个我们自己的ftp客户端,这篇文章一方面是写如何封装ftp客户端,另外一方面也是想介绍如何基于开源库去封装自己工具库,希望大家可以有所收获,下篇见!

2024-07-25 13:06:30 889 2

原创 c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

在上一篇文章中我们提到过ftp的传输模式有主动/被动传输两种模式,而一般情况下我们默认是被动模式,这里我们的介绍也以被动模式为主。

2024-07-19 20:03:24 1093 1

原创 c++网络编程实战——开发基于ftp协议的文件传输模块(一)ftp协议介绍

我们将某台计算机中的文件通过网络传送到可能相距很远的一台计算机桑,这就是文件传送,而文件传输协议ftpftp交互式的访问允许文件拥有存取权限而在因特网发展的早期阶段,用ftp来传送文件占整个因特网通信量的1/3,到了1995年万维网www才超过了FTP。

2024-07-18 18:22:00 269

原创 cpp随笔——如何实现一个简单的进程守护模块

以上就是一个简单的守护模块的全部实现细节,下篇见!

2024-07-13 08:17:03 906

原创 上机算法刷题暑期篇(二) ——AcWing 3719. 畅通工程(天大)

我们来简单看一下题目,我们假设有。

2024-07-12 20:35:40 583

原创 上机算法刷题暑期篇(一) —— AcWing 3692. 最长连续公共子序列(西电)

这道题无疑就是一道最常见的dp问题,而dp问题最重要的无疑就是状态转移了,而在这道题中,我们假设。,我们第一反应应该是什么?,我们就要更新res,同时由于。

2024-07-12 03:18:44 1043

原创 2023年高教杯数学建模2023B题解析(仅从代码角度出发)

求解灵敏度分析over!

2024-07-09 16:12:27 4668 18

原创 计算机视觉——opencv快速入门(二) 图像的基本操作

上一篇文章中我们介绍了如何配置opencv,而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。

2024-07-05 19:26:05 616

原创 cpp随笔——如何实现一个简单的进程心跳功能

在我们日常后台服务程序运行中,一般是调度模块,进程心跳以及进程监控共同工作,进而实现实现服务的稳定运行,在前面我们介绍过如何去实现一个简单的调度模块,而今天我们所要介绍的就是如何实现进程的心跳,首先什么是进程的心跳呢?,我们在后台服务程序在运行中由于有很多功能需要运行,所以一般是以多进程的方式来同时运行多个后台服务程序,那么问题来了,当有多个后台服务程序在运行时我们如何来确定它们的运行状态呢?结构体中存储了进程的相关信息,同时我们会通过atime和timeout。

2024-07-04 15:29:14 819 2

原创 计算机视觉——opencv快速入门(一) opencv的介绍与安装

OpenCV是开源计算机视觉库,支持C++, Python, Java等,用于图像处理、视频分析等。建议使用较早版本如3.4.3,因高版本部分算法需付费。通过Anaconda创建Python虚拟环境来安装,选择合适的Python和OpenCV版本。激活环境后,用`pip`安装`opencv-python`。基本环境配置完成后,通过显示图像的Python代码测试安装是否成功。

2024-06-26 00:25:52 544

原创 cpp随笔——如何实现一个简单的调度程序

调度程序用于周期性运行服务,如生成测试数据或定时发送消息。核心思路是通过`fork`创建子进程,父进程退出,子进程由init进程管理,实现后台运行。示例C++代码展示了一个简单的调度器,接收运行周期和程序参数,不断 fork 新进程执行指定程序,`execv` 用于执行命令。当程序结束,调度器等待一定时间(周期)后重启。程序设计确保不受外部干扰,并忽略SIGCHLD信号避免僵尸进程。

2024-06-25 15:30:09 372

原创 c++进阶篇——初窥多线程(三)cpp中的线程类

C++11引入了`std::thread`,提供对并发编程的支持,简化多线程创建并增强可移植性。`std::thread`的构造函数包括默认构造、移动构造及模板构造(支持函数、lambda和对象)。`thread::get_id()`获取线程ID,`join()`确保线程执行完成,`detach()`使线程独立,`joinable()`检查线程状态,`operator=`仅支持移动赋值。`thread::hardware_concurrency()`返回CPU核心数,可用于高效线程分配。

2024-06-24 17:52:53 868

原创 cpp随笔——浅谈右值引用,移动语义与完美转发

右值引用是C++11引入的关键特性,用于优化资源管理。它分为纯右值(临时对象)和将亡值(即将消失的引用)。右值引用`&&`允许直接访问临时对象,避免拷贝开销。移动语义利用右值引用实现资源转让,提高效率,如在对象构造和赋值时。`std::move`帮助左值转换为右值引用,以利用移动语义。完美转发保持参数的左/右值属性不变,`std::forward`确保在转发时正确处理这些属性。代码示例展示了不同情况下的转发行为。

2024-06-23 21:54:41 885

原创 c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写

本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C+

2024-06-21 23:28:09 993

原创 c++理论篇——初窥多线程(一) 计算机内存视角下的多线程编程

虚拟内存可以用来加载数据,一般是物理内存不够存放的话会放到虚拟内存中虚拟内存所对应的是一段连续的内存地址,起始位置为0(注意:之所以说虚拟,是因为这个起始位置是被虚拟出来的,并不是物理内存的0地址虚拟内存的大小一般也是由操作系统所决定的,比如32位操作系统的虚拟地址空间大小为2^32位,64位操作系统的大小则是2^64位,每当我们在电脑上运行一个可执行程序的时候,就会得到一个进程,内核会给每一个运行的进程创建一块独属于它们的虚拟内存地址空间,并且将应用程序的数据装载到虚拟地址空间对应的地址上。

2024-06-18 00:36:08 782

原创 go语言后端开发学习(三)——基于validator包实现接口校验

在讲解validatorgorm.Model在博客中我设置了两种角色管理员(role=1)与普通用户(role=2),而这也造成了一个问题:我们在添加用户按照正常业务情况是不能直接在前台创建管理员,而这个就需要我们在后端进行参数校验了(备注:其实参数校验这件事前后端都是要做的,但是我们这里介绍主要是后端,就以后端视角来介绍了),而接下来我们以给这个用户模块做参数校验为例,来介绍一下我们如何来实现参数校验以及一些其他的相关操作。

2024-06-10 20:43:26 819

原创 go语言后端开发学习(二)——基于七牛云实现的资源上传模块

在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考),但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的,因为文件的上传与读取会频繁进行磁盘读写,会造成资源的不必要浪费,所以我们一般会寻找第三方平台来托管我们的一些文件资源,而这也就是我们今天的主题——。

2024-06-08 03:15:33 1081

原创 go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

在RFC标准中,JWTHeader: 头部Payload: 载荷Signature: 签名我们会将这里的每一个部分用一个点而这就是一个JWT令牌的标准结构,接下来网格大家来逐个讲解每个结构的作用。// JWT结构体JWTKey []byte // JWT密钥func NewJWT() *JWT { //新建JWT结构体// 自定义声明Username string `json:"username"` //这里的与gorm中声明的保持一致// 定义相关错误信息var (

2024-06-05 12:54:08 1384 1

原创 Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)

", 18)foreignKeyreferences在GORM中允许我们去使用自定义的数据类型,但是我们必须要实现Scanner与Value接口,以便让GORM知道如何接收并保存该类型到数据库中。= nil {fmt.Println("数据库连接失败,err:", err)returnif err!= nil {

2024-05-30 01:07:52 1392

原创 Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询

和我们在gin框架中讲解的Hook函数一样,我们也可以在定义HookHookHook。

2024-05-28 00:41:49 858

原创 Go语言之GORM框架(二) ——GORM的单表操作

在讲解单表查询之前,我们先来看一个很简单的单表查询代码import ("fmt""log""os""time"if err!= nil {fmt.Println("数据库连接失败,err:", err)returnfmt.Println("数据库连接成功")myDB = dbmysqlLogger = logger.Default.LogMode(logger.Info) //设置日志打印级别。

2024-05-26 20:24:03 1153

原创 Go语言之Gorm框架(一) ——初窥Gorm框架

模型是使用普通结构体定义的。这些结构体可以包含具有基本Go类型、指针或这些类型的别名,甚至是自定义类型(只需要实现 database/sql 包中的Scanner和Valuer接口)我们来看一下Gorm给出的userName string // 一个常规字符串字段Email *string // 一个指向字符串的指针, allowing for null valuesAge uint8 // 一个未签名的8位整数CreatedAt time.Time // 创建时间(由GORM自动管理)

2024-05-25 14:50:23 908

原创 Gin框架学习笔记(六)——gin中的日志使用

fmt.Printf("[三玖]: %v %v %v %v \n",[三玖]: GET / main.main.func1 3至此我们对Gin框架的简单学习就到此为止了,更多的学习大家可以前去查看Gin框架官方文档Gin框架官方文档后面就要开始对Gorm的学习了,下篇见!

2024-05-21 23:16:23 1528

基于c语言封装的ftp客户端开源库

ftp

2024-07-25

golang(基于goroutine实现的tcp聊天室)

golang(基于goroutine实现的tcp聊天室)

2024-07-11

2023数学建模国赛b题

2023数学建模国赛b题

2024-07-09

2023数学建模国赛b题

2023数学建模国赛b题

2024-07-09

QT数据库大作业-登录页面

QT数据库大作业-登录页面

2024-06-01

图书管理系统数据库设计文档

数据库设计文档

2024-04-29

图书管理系统的sql脚本

图书管理系统的sql脚本

2024-04-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除