自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发计算demo

跑了几次,能看到性能提升有4-5倍左右,min_per_thread可以根据实际的总量来调整。研究了下多线程并发计算的魅力,性能提升确实还是比较明显。

2024-01-19 14:29:22 383

原创 排序算法-选择排序详解

选择排序是一种简单直观的排序方法。每次将最小(最大)值通过比较交换到最前面来实现排序。

2023-09-28 15:48:56 123

原创 C++设计模式-工厂模式

工厂模式属于创建型设计模式,它将对象实例化的具体过程封装起来,取代直接new对象的方式,使对象实例化与业务代码逻辑隔离。被创建的产品对象所属的类一般都具有相同的父类。工厂模式分为:简单工厂模式,工厂模式和抽象工厂模式。实现复杂度:简单工厂模式最简单,工厂方法模式次之,抽象工厂模式最复杂。如果将简单工厂模式的代码修改得符合“开闭原则”,就变成了工厂模式;如果修改工厂模式的代码,使得一个工厂支持多个产品的生产,那就成了抽象工厂模式。

2023-09-28 11:21:42 120

原创 排序算法-希尔排序详解

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是一种不稳定排序。

2023-09-27 10:51:24 384

原创 排序算法-插入排序

插入排序是指每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。

2023-09-21 21:59:51 43

原创 排序算法-冒泡排序

冒泡排序是一种基础的排序算法,由于是将元素向末尾移动,立起来看就像是泡泡从底部冒到顶端一样,故取名叫冒泡排序。

2023-09-20 22:07:33 33

原创 排序算法-快速排序详解

快速排序也使用了分治的思想,在待排序序列中选择一个基准值,然后将小于基准值的数字放在基准值左边,大于基准值的数字放在基准值右边,然后左右两边递归排序,整个排序过程中最关键部分就是寻找基准值在待排序序列中的索引位置。快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快速排序。

2023-09-19 18:31:50 93

原创 排序算法-归并排序详解

归并排序采用分治的思想,采用先拆分再合并的方式,得到完全有序的序列。归并排序属于稳定排序。

2023-09-15 17:55:35 46

原创 排序算法-堆排序详解

堆:必须满足完全二叉树的定义大顶堆:父节点的值始终比左右子节点的值都要大,且堆顶的值最大。大顶堆如下图所示:如上图:我们构建了一个大顶堆,任何一个节点都比自己的左右子节点的值要大,但不要求左右子节点之间的大小关系,堆顶的值最大,然后根据堆构建一个数组[16,14,10,8,7,9,3,2,4,1],可以看出该数组是由二叉树的层序遍历得到的。大顶堆的性质:1、对于下标为i的节点,它的父节点的下标为(i-1)/2;

2023-09-07 20:42:59 38

原创 重学Golang-反射

反射是指一类应用,可以通过采用某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

2023-08-23 18:06:19 33

原创 重学Golang-函数总结

闭包是有函数和与其相关的引用环境组合而成的实体。闭包是从其主体外部引用变量的函数值。函数可以访问并分配给引用的变量,即函数是被“绑定”到了变量上。闭包的实质是函数的嵌套,内层的函数可以使用外层函数的所有变量。不要在循环中调用defer,但是可以在循环中增加一个局部函数来调用defer。recover()函数必须要在defer函数中运行。4)返回多个匿名匿名函数的函数。1)不带参数的匿名函数。3)带返回值的匿名函数。2)带参数的匿名函数。

2023-08-21 19:21:54 40

原创 重学Golang-通道使用总结

通道是用来传递数据的一个数据结构,Go语言中提倡用通信的方式来替代共享内存。当一个资源需要在协程之间共享时,通道会在goroutine之间建立一个管道,并提供了确保同步交换数据的机制。go中保证了在任何时候,同时只能有一个goroutine同时访问通道进行发送和获取数据。通道属于一种队列的数据结构遵循“先进先出”的规则。需要注意的是channel的传递是传引用,在使用前需要make分配内存。如果要使用一个带缓冲的通道,需要提前设置通道的cap。

2023-08-19 13:47:46 165

原创 重学Golang-Go语言模块管理

最近在工程中对模块接触的比较多,下面分享一下如何进行Go的模块化开发。使用Go的模块管理需要要求你的Go版本在1.11以上,主要目的就是用模块来管理依赖,首先确保环境变量中GO111MODULE=on状态。一个模块就是一组包的集合,也就是go.mod文件所在目录下定义的所有包都属于这个模块,go.mod文件定义了模块的路径,这个路径是用于import包的路径的集合,在编译时该模块会依赖其他模块。该模块依赖的模块会通过模块路径加语义化版本号的格式添加到go.mod中。

2023-08-17 20:41:26 53

原创 重学Golang-接口使用总结

接口类型是对其他类型行为的概括与抽象,接口类型可以定义一组方法,但是这些方不是必要实现的。接口本质上也是一种类型,是指针类型,接口可以实现多态。接口本身不能创建实例,但是可以只想一个已经实现了该接口方法的自定义类型来实现。

2023-08-16 21:59:40 39

原创 重学Golang-结构体使用总结

Go语言中是使用组合来实现继承的,例如下面的例子,基于父类,如果创建一个子类,就要把父类给加到子类结构体中,变成其中的一个成员,同时,在子类中也可以覆写父类的方法,例如Study(),如果想要调用父类的方法,应该主动去调用父类的成员来实现。结构体字段标签是指结构体成员字段的额外信息,常用作对字段进行说明,尤其在json序列化以及对象关系映射时,标签信息是静态的!Go语言中函数名的首字母大小写需要特别注意,是用来控制对方法的访问权限的,当方法的首字母为大写时,这个方法对于所有的包都是公开的。

2023-08-15 19:14:15 38

原创 重学Golang-map的使用总结

map需要注意的是在使用前需要进行初始化,即使用make为map初始化内存,否则是一个nil值。

2023-08-13 19:06:23 31

原创 重学golang-执行shell脚本

Go语言中提供了os/exec包来运行shell命令,os/exec包的Command()函数可以用于输入Shell命令,主要传入程序命令行和参数,第一个参数是命令行,第二个参数是命令行的参数,返回一个*Cmd的结构体,此结构体代表了一个执行的外部命令,当调用它的Run()、Output()、CombinedOutput()等方法后,这个命令就不能再次重复使用了,相当于是次抛。再举一个通过输入流到命令中,得到输出的例子:tr a-z A-z是将输入缓冲区汇总的小写转为大写。

2023-08-11 18:10:35 656 2

原创 重学Golang-操作字符串

string包中提供了Split()、SplitN()、SplitAfter()、SplitAfterN()四个函数来处理正则分割字符串。函数表示字符串s按照满足函数f的字符来分割字符串 ,返回值是切片。函数表示截取字符串s两端满足函数f的字符。

2023-08-09 21:18:24 58 1

原创 重学Golang-读写CSV文件

Go语言提供了很便捷的方法来读写CSV格式的文件,就是使用encoding/csv包来处理。

2023-08-08 20:13:16 628

原创 重学Golang-iota的使用总结

近期项目需要用到go语言来开发,已经一两年没写过了,这次打算把go学的深一些,分享一些学到的高级用法,希望大家批评指正。

2023-08-07 20:45:00 170 2

原创 gRPC的理解(1)-RPC和gRPC概念

​本篇先介绍RPC与gRPC的基本概念,后续会结合具体原理及源码和例子来对gRPC进行详细介绍。

2023-08-06 14:56:11 187

原创 TUN/TAP口的了解

TUN/TAP是一对虚拟网络设备接口,它们是Linux内核中的一部分。TUN设备被用于处理IP协议数据包,而TAP设备则处理以太网帧。使用TUN/TAP接口,用户空间程序可以像操作物理网络设备一样操作这些虚拟设备,从而实现对网络数据包的捕获、修改和注入等操作。TUN/TAP设备的实现基于Linux内核的网络栈,并通过设备文件的形式暴露给用户空间。

2023-08-04 18:22:08 984 1

原创 linux信号在多线程中的使用2

本文会对信号的一些需要注意的地方进行详细的总结,下面所介绍的函数的定义可以在上一篇文章中查看。

2023-08-03 21:00:00 79

原创 linux信号在多线程中的使用1

3.oldset:指向一个sigset_t类型的信号集,用于存储修改前的旧信号屏蔽字。注册信号处理函数:每个线程可以通过sigaction 函数注册自己的信号处理函数,以捕获特定信号。SIG_UNBLOCK:将set中指定的信号从线程的信号屏蔽字中移除,即允许接收这些信号。SIG_BLOCK:将set中指定的信号添加到线程的信号屏蔽字中,即屏蔽这些信号。2.set:指向一个sigset_t类型的信号集,用于指定需要修改/设置的信号。SIG_SETMASK:将set中指定的信号设置为线程的新信号屏蔽字。

2023-08-02 21:05:29 157

原创 Linux多线程之pthread_key_create()

本文介绍了pthread_key_create()函数在多线程编程中的基本概念、功能和使用方法。通过了解pthread_key_create()的使用,可以更好地管理多线程编程中的线程特定数据,避免数据竞争和其他相关问题的发生。在使用pthread_key_create()函数时,需要注意以下几点:1 键的范围pthread_key_t类型的键的范围通常是有限的,具体取决于系统的实现。因此,在创建和使用键时,应确保键的数量不会超出系统限制。2 线程特定数据的初始化。

2023-08-01 15:35:10 1015 1

原创 C++引用、移动语义与完美转发来看这篇就够了

std::move的作用是将一个左值/右值强制转化为右值引用,继而可以通过右值引用使用该值,所以称为移动语义。引用在c++中是一个特别的类型,因为它的值类型和变量类型不一样,引用这个变量是一个引用类型,但是它的值类型不是, 左值引用和右值引用变量的值类型都是左值, 而不是左值引用或者右值引用。报错原因是:不能绑定右值引用类型"int&&" 到左值类型"int"上,根本原因就是在万能引用传递后,a退化为了int类型。可以看出,std::move原型的实现最终就是将传入的所有类型转化为一个右值引用返回。

2023-07-31 17:45:48 60 1

原创 C++之STL std::function及std::bind总结

bind第一个参数传入一个函数、函数指针、lamda表达式、类的成员函数都是可以的,这里注意,如果是类的成员函数,则需要再类的作用域前加上&,第二个占位符需要注意,如果不是类的成员函数,那么直接要么是一个参数,例如10,或者std::placeholders::_1(由调用bind返回值时传入),如果是类的成员函数,第二个参数是实例化的类对象,第三个参数开始才是函数的输入参数。也可参考std::function对于类的成员函数的调用。注:调用类成员函数时,需要和std::bind一起使用;

2023-07-30 20:03:10 939 1

原创 手写一个C++线程池V2

i++)});task();})t.join();

2023-07-29 18:38:03 54

原创 EAP-AKA协议:保障移动通信安全的关键

EAP-AKA是一种用于无线网络中的安全认证协议。它是基于GSM(Global System for Mobile Communications)中的认证和密钥协商算法IK(Authentication and Key Agreement)的扩展版本。EAP-AKA的主要目的是提供安全的用户身份验证和密钥协商机制,以保护无线网络中的通信。它适用于诸如3G/4G移动通信网络之类的无线网络环境。EAP-AKA’

2023-07-28 17:58:28 1901 1

原创 理解 Network Access Identifiers(NAI):网络访问标识符

Network Access Identifiers(网络访问标识符)是一种用于标识网络用户身份的标准化格式。它是一个字符串,通常包含用户的身份和域名信息,用于在网络认证和授权过程中唯一识别用户。NAI作为网络访问标识符,在现代网络中扮演着至关重要的角色。它不仅简化了身份验证和授权过程,还为用户提供了跨网络的便利性。然而,我们也要意识到NAI的安全性问题,并采取合适的措施来确保用户隐私和网络的安全性。通过理解和应用NAI,我们可以构建更安全、可靠的网络环境,推动数字化世界的发展。

2023-07-27 20:00:00 634 1

原创 手写一个C++线程池-V1

首先介绍下线程池的作用,线程池属于一种多线程的使用模式,在运行时,生产者会将任务添加到中,而消费者会在创建线程后从此任务队列中获取任务来自动处理。这样避免了在短时间内创建和销毁线程的代价。线程池不仅能够内核的充分利用,还能防止过分调度。可用的线程数据取决于可用的并发处理器,处理内核,内存,网络sockets等数量。线程池中的所有线程都有默认的堆栈大小和默认优先级运行。如果一个线程处于空闲态,例如等待某个事件的发生,那么线程池将会插入另一个线程来使所有的处理器保持繁忙。

2023-07-24 22:14:09 53

原创 非3GPP接入与TWIF

上篇在介绍非3GPP接入时,提到了四种与5G核心网互通的网元,并着重对N3IWF(非授信非3GPP网络互通网元)进行了介绍,由于N3IWF是非授信的,所以需要额外通过建立IPSec隧道来保证接入的安全性。但是TWIF(授信WLAN互通网元)是可信的,所以不需要额外的保证安全性,而且TWIF针对接入的设备,是不具备5G接入能力的设备(N5CW),即不支持NAS能力,通过WI-FI来接入到核心网中的一类设备,本文将对TWIF进行详细介绍。

2023-07-23 20:19:35 675 1

原创 非3GPP接入和N3IWF

TNGF( Trusted Non-3GPP Gateway Function):这个NF的主要功能是实现终端从授信的非3GPP网络接入到5G核心网,授信是指非3GPP是可信的,比如WIFI网络也是5G核心网运营商运营的,是可以信任的网络。此时,终端通过TNGF再接入5G核心网。N3IWF (Non-3GPP InterWorking Function):这个NF的主要功能是实现终端从非授信的非3GPP网络接入到5G核心网,这个时候,终端就需要先与N3IWF建立安全的连接,再接入到5G核心网。

2023-07-22 18:29:15 772

原创 C++线程同步-条件变量(std::condition_variable)

线程同步是指线程间需要按照预定的先后次序顺序进行的行为。一个线程的执行需要依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,知道消息到达才被唤醒。

2023-07-20 20:00:00 154

原创 WIFI接入认证2-WPA/WPA2-Enterprise

书接上回,WPA包含了802.1X的身份认证和加密,主要分为两种:WPA-Personal (WPA PSK) 和WPA-Enterprise,本文重点介绍WPA-Enterprise,它主要用于大型公司和大型企业。远程身份验证拨入用户服务(RADIUS)身份验证服务器需要提前部署好,Radius服务器与AP保持通信,用于自动密钥生成和身份验证,并且使用可扩展身份验证协议(EAP)对客户端进行身份验证。

2023-07-18 20:45:00 981 1

原创 WIFI接入认证-WPA/WPA2-PSK

WPA(WiFi 保护接入)目前有WPA、WPA2和WPA3三个版本,高版本强化了安全性和设备支持等等,本篇不对每一种认证都展开比较,只针对WPA接入的流程做讲解。WPA分为两个流程,一个是STA(接入的终端设备)与AP(无线接入点)的关联流程,另一个就是认证流程。

2023-07-17 18:13:50 856 1

空空如也

空空如也

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

TA关注的人

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