自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 问答 (2)
  • 收藏
  • 关注

原创 UE5 编程规范

使用现代C++编程标准, 使用前沿C++标准库版本.

2023-08-15 22:34:57 567

原创 UE5 增强输入——触发器和修改器

触发器:

2023-04-22 15:42:49 1015 1

原创 C++实现八叉树

【代码】C++实现八叉树。

2022-10-24 21:18:30 1144

原创 C++实现跳表

【代码】C++实现跳表。

2022-10-24 21:17:50 545

原创 C++抽象工厂模式

C++实现抽象工厂模式

2022-07-08 20:41:17 419

原创 C++工厂方法模式

C++实现工厂方法模式

2022-07-08 20:40:42 446

原创 C++迭代器模式

C++实现迭代器模式

2022-07-08 17:26:41 344

原创 C++状态模式

C++实现状态模式

2022-07-08 16:25:12 574

原创 C++代理模式

C++实现代理模式

2022-07-07 22:08:31 342

原创 C++观察者模式

C++实现观察者模式

2022-07-07 20:08:33 160

原创 C++适配器模式

C++两种方式实现适配器模式。

2022-07-07 17:59:49 783

原创 Git使用详解

全局设置,一次就行:git config --global user.name “adce”git config --global user.email “adce@qq.com”查看用户名和邮箱:git config user.namegit config user.email选择仓库:mkdir mygitcd mygit初始化仓库:git init将文件保存在暂存区。touch file.txt添加到仓库:git add file.txt提交到特定的分支,默认是master。一般是多

2022-06-24 16:41:50 224 1

原创 Golang-网络编程

TCP服务端package mainimport ( "bufio" "fmt" "net")// TCP server端func process(conn net.Conn) { defer conn.Close() // 关闭连接 for { reader := bufio.NewReader(conn) var buf [128]byte // 使用切片接收 n, err := reader.Read(buf[:]) // 读数据 if err != n

2022-05-25 11:00:30 537 1

原创 Unix环境高级编程-Posix线程特有数据

至于使用这个东西的意义,想不通,既然想特定线程,为什么不保存在线程栈里呢?/** * @file specific.c * 特定于线程的数据 */#include <pthread.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>pthread_key_t key;pthread_once_t once = PTHREAD_ONCE_INIT;// 自定义的析构函数,

2022-05-20 23:05:50 161

原创 Unix网络编程-TCP心跳包的实现(使用紧急数据)

发送端三个新函数/** * @file heartbeatcli.c * 紧急数据实现心跳包 */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/ip.h>#include <netinet/in.h>#include &

2022-05-20 00:24:34 516

原创 Unix网络编程-TCP带外数据(紧急数据)

简单的发送程序/** * @file oobtcpsend1.c * 简单的带外数据发送程序 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/ip.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu

2022-05-19 23:54:27 347

原创 Unix网络编程-非阻塞IO

非阻塞IOUnix所提供的IO默认都是阻塞IO,在高性能网络库中,一般不会使用阻塞IO,不论是普通的消息收发,甚至是connect函数,accept函数,此文重写str_cli(),以及改写connect,accpet,写成非阻塞版本。str_cli()/** * @file str_cli.c * 非阻塞版本 * 不建议在网络通信中使用标准IO,虽然有缓冲区 * 但是标准IO的缓冲区操纵难度大,弊大于利 * 这里我们使用自己建立的缓冲区数组 */#include <stdlib.

2022-05-18 15:12:11 242

原创 Unix网络编程-Unix域套接字

Unix域套接字的bind调用/** * @file bind.c * Unix域套接字 * 创建域套接字,绑定路径名,getsockname输出这个这个绑定的路径 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#in

2022-05-17 17:36:48 312

原创 Unix网络编程-使用select执行TCP和UDP业务

/** * @file server-select-TCP-UDP.c * 使用select同时处理TCP和UDP */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/select.h>#include <arpa/inet.h&

2022-05-07 17:36:21 443

原创 Unix网络编程-IO多路复用Poll

服务端/** * @file server-poll.c * 使用poll,只需要维护一个结构体数组,不需要维护两个fd_set和一个clients数组 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <poll.h>#include <sys/types.h>#include &lt

2022-05-06 00:19:58 252

原创 Unix网络编程-IO多路复用Select

客户端/** * @file client-select.c * 使用select改进client1.c中的str_cli函数 * 这个str_cli函数是不正确的: * 1.标准IO缓冲区不会触发select,不建议待缓冲区的IO和select一起使用 * 2.写完就关闭套接字,可能会有数据遗留在网络中,应该先进行半关闭 * */// 只负责连接#include <stdio.h>#include <stdlib.h>#include <string

2022-05-06 00:19:13 198

原创 Unix网络编程-Posix消息队列

消息队列的创建命名只能是/queuename.默认存放在/dev/mqueue里,(posixIPC都在这里,System V 可以用ipcs查看)与内核相同的持续时间——除非删除队列,否则里面的消息不丢失存在引用计数,最后一个计数为0且unlink可以删除创建:/** * @file 1-mqcreate.c * 创建一个消息队列 */#include <stdio.h>#include <stdlib.h>#include <fcntl.h&gt

2022-05-01 22:16:16 535

原创 Unix网络编程-客户端和服务端不同的终止状态

正常终止信号处理回收子进程处理被中断的慢系统调用accept返回前终止在完成三次握手和accept返回之间(这是一个很小的间隔),客户端重发了RST报文,导致accept失败。这个时候的connect还是可以复用的,所以只要重新连接就行了。通过套接字选项可以设置RST报文。此时Posix下errno值会被设置成ECONNABORTED。因为这个错误是非致命的,所以可以重新启动accept。只要处理这个错误,并再循环执行accept就可以了。服务器进程终止进程终止与主机崩溃不同。服

2022-05-01 20:09:08 796

原创 Unix网络编程-信号回收子进程和信号对慢系统调用的影响

信号对慢系统调用的影响信号从接受到处理是有一个过程的,因为这个时候信号集要进内核,并从内核出来再执行信号处理函数。就可能会导致一些慢系统调用函数的假性出错(就是这个函数本身没有出错,而是由于内核执行了信号处理,才导致它出错),有些函数假错是可以重新启动的,比如说:accept,listen,read,write等;但是connect是不能重新启动的,如果对connect重连,会直接返回错误,正确的做法是关闭套接字,重新打开进行连接。信号打断accept:几乎所有的慢系统调用含税被信号打断,都会报一个E

2022-05-01 20:08:14 488

原创 Unix网络编程-管道和FIFO

管道/** * @file pipe.c * 1.客户端传送给服务端一个路径名字 * 2.服务端读取文件内容通过ipc传送给客户端 * 3.客户端将读取的内容显示到标准输出 * * 管道本身是半双工,fork之后是可以全双工,但是只有一个管道缓冲区,根本没法进行通信 * 全双工的通信还是像下面这样,用两个管道,用两个缓冲区实现 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#

2022-04-26 22:48:19 283

原创 网络协议详解

网络模型OSI七层模型:学习用的五层模型:路由器中只有下三层(网络层,链路层,物理层)。协议和数据:交换机是多接口的网桥,全双工通信,有自学习MAC地址的能力。路由器隔绝广播域,隔绝不同子网,连接不同网段。MAC地址和IP地址IP地址是目标地址,MAC地址是每一步的地址。每一个网卡都有一个6字节的MAC地址,且全球唯一。mac地址的标识格式:当消息在网络上传输的时候,我们给出目标IP地址,消息通过路由器的转发,最终到达目标IP地址的主机上。因为IP的底层是MAC,所以转发的

2022-04-26 12:00:43 3595

原创 C++常用设计模式总结

重构关键技法静态到动态早绑定到晚绑定继承到组合编译时依赖到运行时依赖紧耦合到松耦合设计原则变化是复用的天敌。面向对象与软件设计的目的:隔离变化:将变化带来的影响降为最小微观层面:各司其职,新产生的类不影响已存在的类对象的作用:语言层面:封装了数据和代码规格层面:一系列可被使用的公共接口概念层面:拥有某种责任的抽象依赖倒置原则DIP高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。抽象(稳定)不应该依赖于实现细节(变化),实现细节

2022-04-10 21:32:12 1148

原创 C++线程编程-各种线程池

线程池存放任务的线程安全队列// 对比4.5 使用条件变量的线程安全队列的完整类定义// 包含shared_ptr实例#include <condition_variable>#include <mutex>#include <queue>#include <utility>#include <memory>template <typename T>class threadsafe_queue{private:

2022-04-09 17:54:49 1098

原创 C++线程编程-设计多线程版本的accumulate

非异常安全// std::accumulate的并行版本,非异常安全版本#include <numeric>#include <iterator>#include <thread>#include <vector>#include <functional>template<typename Iterator, typename T>struct accumulate_block{ void operator()

2022-04-08 22:38:58 899

原创 C++浅谈内存模型

一个程序的生命程序是一群指令的集合。手写的cpp代码是存储在磁盘上的(固态硬盘等),这时候没有什么内存的概念,只是把写进入的内容存储下来,等点击编译器的编译按钮的时候,编译器的运行程序(比如说g++)将会对这群死代码进行处理,处理的过程为:.cpp 源文件 –预编译处理–> .i 文件 –编译–> .s 汇编文件 –汇编–> .o 文件 –链接–>可运行文件。上述几步,也没有内存的概念。预编译处理读源文件,处理源文件中:宏定义指令:如#define #undef等条

2022-04-01 17:28:28 171

原创 C/C++Unix网络编程-IPC简介

IPC是进程间通信的简称。进程、线程与信息共享Unix进程间的信息共享的方式:(1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样既可保护多个写入者,防止相互串扰,也可保护一个或多个读出者,防止写入者的干扰。(2)中间的两个进程共享驻留于内核中的某些信息。是这种共享类型的一个例子,System V消息队列和System V信号量也是。现在访问共享信息的每次操

2022-03-28 19:32:56 2593

原创 Unix环境高级编程-进程间通信

进程间通信同一台主机上的进程通信 – 不同主机上的通信1、管道内核提供,单工,自同步机制:管道永远是迁就慢的那一方在使用管道的时候,一般一个进程的一个管道只使用read或者write,最好把另一端关闭。绝对不会一根管道双工通信,只能用两根管道匿名管道: pipe(); #include <unistd.h> int pipe(int pipefd[2]); #define _GNU_SOURCE /* See feature

2022-03-28 15:53:28 1836

原创 C/C++Unix网络编程-套接字编程简介

套接字地址结构套接字的地址结构可以在两个方向上传播:从进程到内核和从内核到进程。IPV4套接字地址结构sin_len是长度字段,有的平台上的套接字没有这个东西,因为有外置的sizeof运算符。...

2022-03-28 10:12:37 2043

原创 C++线程编程-设计无锁的并发数据结构

定义和结果使用互斥元、条件变量以及future 来同步数据的算法和数据结构被称为阻塞的算法和数据结构.调用库函数的应用会中断一个线程的执行,直到另一个线程执行一个动作.这种库函数调用被称为阻塞调用,因为直到阻塞被释放时线程才能继续执行下去.通常,操作系统会完全阻塞一个线程(并且将这个线程的时间片分配给另一个线程),直到另一个线程执行了适当的动作将其解锁,可以是解锁互斥元、通知条件变量或者使得future就绪.不使用阻塞库函数的数据结构和算法被称为非阻塞的.但是,并不是所有这样的数据结构都是无锁的,因此我

2022-03-27 11:28:35 1791

原创 C++线程编程-设计基于锁的并发数据结构

序列化多个线程轮流存取互斥元保护的数据,它们必须线性的而非并发的存取数据。高并发就意味着:更小的保护区域,更少的序列化,更高的并发潜能。设计基于锁的并发数据结构关键是要确保存取数据时要锁住正确的互斥元,并且要确保将锁的时间最小化.只用一个互斥元保护一个数据结构是很困难的.你需要确保此数据在互斥锁保护区域之外不会被存取,并且不会发生接口所固有的竞争现象.如果使用独立的互斥元来保护数据结构的独立部分,问题会变得更复杂,并且如果数据结构上的操作需要多个互斥元被锁住就有可能产生死锁.因此,设计有多个互斥元的数

2022-03-26 15:31:21 1539

原创 C++线程编程-内存顺序

内存顺序模型有六种内存顺序选项可以应用到原子类型上, memory_order_relaxed;memory_order_consume; memory_order_acquire;memory_order_release;memory_order_acq_rel; memory_order_seq_cst;它们代表三种模型:顺序一致 memory_order_seq_cst;获得-释放:memory_order_consume; memory_order_acquire;memory_orde

2022-03-24 15:01:15 2895 2

原创 C++线程编程-FP编程和CSP编程

FP/** * 使用操作同步来简化代码 - 带有future的函数式编程(FP) * * 才有函数式的方法来编写程序,并非直接在线程之间共享数据; * 而是每个任务都可以提供它所需要的数据,并通过使用future将结果传播至需要它的线程 * * future是使得C++FP风格的并发切实可行的最后一块拼图; * 一个future可以在线程之间来回传递,使得一个线程的计算结果以来于另一个的结果,而无需任何对共享数据的显示访问。 * * 这个风格的快速排序是用list,因为list的s

2022-03-21 16:04:26 652 2

原创 C++十行代码的快速排序-C++11

全部使用C++11新特性,使用递归方法,FP式编程。template<typename T>list<T> sequential_quick_sort(list<T> input){ if(input.empty()) { return input; } list<T> result; // 将input中的input.begin()这个元素转移到result.begin()的位置 // 不

2022-03-21 14:34:02 756

原创 C++线程编程-时间控制和接受超时的函数

#include <chrono>#include <condition_variable>#include <mutex>#include <future>#include <iostream>using namespace std;using namespace chrono; // chrono的命名空间// 时间操作void fun0(){ // 匀速时钟 steady_clock; // 系统时

2022-03-21 11:16:22 1986

原创 C++线程编程-future和promise

future的使用方式:// 第一种:future和async// 第二种:future和packaged_task// 第三种:future和promise/* 使用promise在单个线程中处理多个连接 */// 这个promise和异步IO有类似的结构#include <future>void process_connections(connection_set &connections){ // 一直循环到没有连接 while (!done(c

2022-03-21 11:09:39 437

空空如也

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

TA关注的人

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