自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 unicode/utf8/utf16/utf32笔记

unicode表示的字符范围是0x0000~0x10FFFF,最多只需要有21位,但是为了字节对齐,所以最多需要32位(4字节)utf8/utf16/utf32都是表示unicode的一种编码方式。utf8和utf16是变长编码,utf32不变长。utf-8编码长度为1,2,3或4字节,utf16编码长度为2或4字节,utf32编码长度恒4字节。

2023-10-02 21:07:04 263

原创 Lua入门(四)相关API

头文件lua.h定义了Lua提供的基础函数,包括创建Lua环境、调用Lua函数(如Lua_pcall)、读写Lua环境中的全局变量,以及注册供Lua调用的新函数等。lua.h中定义所有内容都有一个lua_前缀。头文件lauxlib.h定义了辅助库提供的函数。它的所有定义都以luaL_开头(如luaL_loadbuffer)。辅助库是一个使用lua.h中API编写出的一个较高抽象层。Lua的所有标准库编写都用到了辅助库。基础API的设计保证原子性和正交性,而辅助库则侧重于解决具体的任务。luaL_ne.

2021-12-31 21:29:57 1019

原创 Lua入门(三)用户自定义类型userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 、指针和类)存储到 Lua 变量中调用。userdata分为两类,”full userdata”和”light userdata”。full datastu.lualocal student_obj = Student.create()student_obj:set_name("Jack")student_obj:print()

2021-12-28 16:16:28 2172

原创 Lua入门(二)协程基础

协同程序:拥有自己独立的栈、局部变量和指令指针,又与其他协同程序共享全局变量和其他大部分东西。与线程有些类似,区别是:一个具有多个协同程序的程序在任意时刻只能运行一个协同程序。协程的四种状态挂起态:创建一个协同程序时他开始的状态为挂起态,函数coroutine.yield可以使程序由运行态变为挂起状态,之后还可以再恢复其运行。运行态:函数coroutine.resume可以使程序由挂起状态变为运行态,resume在保护模式中运行。死亡态:协同程序的运行态结束后,协同程序结束,进入停止态。正常态:当

2021-12-21 20:44:21 647

原创 Lua入门(一)元表与元方法

因为明年毕业就要去网易做游戏了,所以学一下lua这个脚本语言。大部分代码参考《lua程序设计》。记录一下方便以后回头看~算术类的元方法如何用’+’,’*'来表示两个table的并集,交集等Set={}local mt={}function Set.new(l) local set={} setmetatable(set,mt) -- 将mt设置为set的元表 for k,v in ipairs(l) do set[v]=true -- val值作为key插入 end r

2021-12-17 20:41:47 1055

原创 Epoll之ET、LT模式

剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)平时大家使用 epoll 时都知道其事件触发模式有默认的 level-trigger 模式和通过 EPOLLET 启用的 edge-trigger 模式两种。从 epoll 发展历史来看,它刚诞生时只有 edge-trigger 模式,后来因容易产生 race-cond 且不易被开发者理解,又增加了 level-trigger 模式并作为默认处理方式。二者的差异在于 level-trigger 模式下只要某个 fd 处于 readable/

2021-03-05 12:05:12 1700

原创 STL源码阅读1——空间配置器

5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码参考文章错误处:第一级配置器直接使用malloc和free,第二级配置器则视情况:当配置区超过128Bytes使用一级配置器,否则采用复杂的内存池策略。参考文章几处要点:1 默认没有定义__USE_MALLOC所有默认二级配置器。下图的simple_alloc是封装的接口,使配置器的接口能符合STL规格2 空间申请:联合体Union代表的是链表节点的结构。free_list的定义:static obj* volatile fre

2021-03-04 21:12:19 138 1

原创 muduo参考博客

muduo网络库学习(三)定时器TimerQueue的设计Muduo网络库源码分析(四)EventLoopThread和EventLoopThreadPool的封装

2021-02-23 21:52:26 124

原创 muduo源码阅读(9): EventLoop事件循环相关类

参考: Muduo网络库源码分析(一) EventLoop事件循环(Poller和Channel)(一)TCP网络编程的本质:三个半事件1.连接的建立,包括服务端接受(accept) 新连接和客户端成功发起(connect) 连接。TCP 连接一旦建立,客户端和服务端是平等的,可以各自收发数据。2.连接的断开,包括主动断开(close 或shutdown) 和被动断开(read(2) 返回0)。3.消息到达,文件描述符可读。这是最为重要的一个事件,对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,

2021-02-18 17:23:33 220

原创 muduo源码阅读(7):ThreadLocal类和ThreadLocalSingleton类

1.ThreadLocal类要点(1)了解线程特定数据在单线程程序中,我们经常要用到“全局变量”以实现多个函数间共享数据。在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。POSIX线程库通过维护一定的数据结构来解决这个问题,这个数据称为Thread-specific Data或 TSD。线程特定数据也称为线程本地存储TLS(Thread-local storage)。对于POD类型的线

2021-02-07 23:33:19 163

原创 muduo源码阅读(6):Singleton类

要点:参考:https://blog.csdn.net/Leeds1993/article/details/52209392(1)了解单例模式实际应用中,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中只有一个打印程序的实例。单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。(2)p

2021-02-05 23:14:13 75

原创 muduo源码阅读(5):BlockingQueue, BoundedBlockingQueue和ThreadPool类

1.了解生产者-消费者问题生产者-消费者问题也被称为有界缓冲区问题,两个进程/线程共享一个公共的固定大小的缓冲区。其中一个是生产者,将信息放入缓冲区;另一个是消费者,从缓冲区中取出信息。问题在于当缓冲区已满,而此时生产者还想向其中放入一个新的数据项的情况。其解决方法就是让生产者休眠,待消费者从缓冲区中取出一个或多个数据项时再唤醒它。同样地,当消费者试图从缓冲区中取数据而发现缓冲区为空时,消费者就休眠,直到生产者向其中放入一些数据时再将其唤醒。2.无界缓冲BlockingQueue.h#ifndef

2021-02-05 22:03:45 155 1

原创 cpp知识点参考链接

https://blog.csdn.net/yankai0219/article/details/6892189#

2021-02-05 19:24:55 139

原创 muduo源码阅读(4):Mutex相关类, Condition类和CountDownLatch类

muduo中对互斥量和条件变量的操作基本上都是调用它们对应的相关函数来实现的。例如MutexLock::lock()即调用pthread_mutex_lock(),Condition::wait()即调用pthread_cond_wait()等等

2021-02-04 21:38:27 111

原创 UNIX网络编程三.非阻塞式I/O

1.非阻塞读和写主要是针对str_cli函数的改写1.1 阻塞IO代码#include "unp.h"intmain(int argc, char **argv){ int sockfd; struct sockaddr_in servaddr; if (argc != 2) err_quit("usage: tcpcli <IPaddress>"); sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&am

2021-02-03 21:10:36 142

原创 UNIX网络编程二. I/O复用:select和poll函数

1. 5种IO模型五种IO模型详解及优缺点2.文件描述符就绪状态书本p1303. select函数linux select函数详解详细讲解了select各个参数的意义,以及调用select的流程图服务端代码:#include "unp.h"intmain(int argc, char **argv){ int i, maxi, maxfd, listenfd, connfd, sockfd; int nready, client[FD_SETSIZE];//最大FD

2021-02-02 23:01:12 137

原创 UNIX网络编程一.TCP客户/服务器程序

1. 代码服务端代码#include "unp.h"intmain(int argc, char **argv){ int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)

2021-02-01 21:55:56 130

原创 智能指针

#include <iostream>#include <thread>#include<vector>#include<string>#include<queue>#include<mutex>#include<unordered_map>#include<unordered_set>#include<memory>using namespace std;void test1

2021-01-22 01:02:08 127

原创 muduo源码阅读(3): Thread类

变量numCreated_表示创建的线程个数,类型为AtomicInt32,用到了我们上篇所说的原子性操作。Thread类中还用到了CurrentThread命名空间的变量和函数。以下要点参考:https://blog.csdn.net/Leeds1993/article/details/52156322(1)线程标识符Linux中,每个进程有一个pid,类型为pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型为pthread_t,由pthread_self()取得,

2021-01-21 15:34:47 141

原创 muduo源码阅读(2): AtomicIntegerT类

所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。在多进程(线程)访问资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。C/C++ 中数值操作,如自加 (n++) 自减 (n- -) 及赋值 (n=2) 操作都不是原子操作。如果多线程程序需要使用全局计数器,程序就需要使用锁或者互斥量保证操作的安全性,对于较高并发的程序,这种做法会造成一定的性能瓶颈。代码的几个要点:(1)gcc提供的

2021-01-20 00:30:42 103

原创 muduo源码阅读(1): Timestamp类

代码的几个要点:(1)Timestamp类继承自boost::less_than_comparable 模板类只要实现 <,即可自动实现>,<=,>=(2)使用到了BOOST_STATIC_ASSERT,编译时断言(3)gmtime和gmtime_r函数(4)函数参数采用值传递(5)使用PRId64(6)对象语义和值语义参考文章(详细介绍以上要点): https://blog.csdn.net/leeds1993/article/details/52117078#com

2021-01-18 11:33:31 83

原创 计算机网络和网络编程知识点博客链接

https://blog.csdn.net/weixin_36750623/article/details/84942341

2020-12-28 17:51:08 114

原创 八.网络套接字

讨论:跨主机的传输要注意的问题字节序问题大端:低地址放高字节小端:低地址放低字节主机字节序:host网络字节序:network解决_ to __: htons, htonl, ntohs, ntohl对齐逻辑地址号(0开始)能否整除sizeof(类型)eg:struct { int i;  float f; char c;}解决:不对齐!...

2020-12-11 11:52:13 227

原创 七.高级IO

非阻塞IO – 阻塞IO补充:有限状态机编程1 非阻塞IO简单流程:自然流程是结构化的复杂流程:自然流程不是结构化的2 IO多路转接3 其他读写函数4 存储映射IO5 文件锁1.数据中继——用有限状态机解决阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO浅谈I/O模型两个设备交换数据:法1:读1->写2->读2->写1 阻塞的形式,容易一直卡在某一步法2:读1->写2 和 读2->写1 分开 非阻塞的形式更好1.非阻塞假错 EA

2020-11-27 16:11:17 362

原创 六.并发之——线程

1.线程的概念2.线程的创建  线程的终止  线程的清理  线程的取消选项3.线程同步4.线程属性  线程同步的属性5. 重入  线程与信号  线程与fork1.概念一个正在运行的函数posix线程是一套标准,而不是实现openmp标准线程线程标识:pthread_t函数:(1).pthread_equal 比较两个线程号(2).pthread_self :获取线程号2.线程的创建函数:pthre

2020-11-23 00:20:06 274

原创 5.桥模式

两个方向互不干扰。corp和Product是业务功能,HouseCorp, ShanZhaiCorp,House,IPod是平台实现。

2020-11-03 16:35:14 60

原创 4.装饰模式

定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活优点:(1)装饰类和被装饰类可以独立发展,而不会相互耦合。(2)装饰模式是继承关系的一个替代方案。(3)装饰模式可以动态地扩展一个实现类的功能。缺点:对于装饰模式记住一点就足够了:多层的装饰是比较复杂的。1.Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。2.ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的对象3.Decorator

2020-10-30 16:44:07 64

原创 3.观察者模式

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知自动更新。被观察者:它必须能够动态地增加,取消观察者。它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。观察者:观察者接收到消息后,即进行update,对接收的消息进行处理具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知具体的观察者:每个观察者在接收到消息后的处理反应是不同的,各个观察者有自己的处理逻辑。参考文章#include <iostre

2020-10-30 14:14:38 75

原创 2.策略模式

定义一组算法,将每个算法封装起来,并且使他们之间可以互换。#include <iostream>using namespace std;//**************************************************************//飞行行为,用抽象类表示class FlyBehavior{public: virtual ~FlyBehavior() {}; virtual void fly() = 0;};//实现飞行行为的方法类

2020-10-29 16:27:46 69

原创 1.模板方法模式

晚绑定机制:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。#include<iostream>#include<string>#include<fstream>using namespace std;class HummerModel {public: virtual void start() {} virtual void stop() {} virtual void alarm

2020-10-29 11:39:41 72

原创 6.8 内存池概念,代码实现

#include <iostream>#include <vector>#include <ctime>using namespace std;namespace _nmsp1 //命名空间{ //一:内存池的概念和实现原理概述 //malloc:内存浪费,频繁分配小块内存,则浪费更加显得明显 //“内存池”,要解决什么问题? //(1)减少malloc的次数,减少malloc()调用次数就意味着减少对内存的浪费 //(2)减少malloc的调用次数

2020-09-28 19:30:09 52

原创 c++primer 12.2.2 allocator类

#include<iostream>#include<vector>#include<queue>#include<unordered_map>#include <memory>#include <string>using namespace std;namespace allocator_ { // reference: C++ Primer(Fifth Edition) 12.2.2 int test_al

2020-09-28 16:35:23 133

原创 五.并发之——信号

1)信号的概念 信号是软件中断2)信号的不可靠3)可重入函数4)信号的相应过程6)常用函数kill()raise()alarm()pause()abort()system()sleep()7)信号集8)信号屏蔽字/pending集的处理9)扩展sigsuspend();sigaction()setitimer()10)实时信号1.信号的概念信号是软件中断,信号的响应依赖于中断。kill -l查看信号。1-31为标准信号,34-64为实时信号core文件:

2020-09-27 00:15:49 351

原创 6.5 malloc(0)的问题

#include <iostream>#include <vector>#include <ctime>#include<algorithm>using namespace std;namespace _nmsp1{ //malloc来分配0个字节 void func() { char *p = (char*)malloc(0); if (NULL == p) printf("got a NULL pointer\n");

2020-09-25 20:37:03 97

原创 6.4局部静态对象,对象数组的构造析构和内存分配

一.局部静态对象的构造和析构#include <iostream>#include <vector>#include <ctime>#include<algorithm>using namespace std;namespace _nmsp1{ //一:局部静态对象的构造和析构 //a)如果我们不调用myfunc()函数,那么根本不会触发A的构造函数; //b)局部静态对象,内存地址是在编译期间就确定好的; //c)静态局部量刚开始也

2020-09-25 17:53:31 229

原创 12. 补充知识,线程池浅谈,数量谈,总结

补充一些知识点虚假唤醒wait中有第二参数(lambda)并且这个lambda中要正确判断要处理的公共数据是否存在C++多线程编程条件变量虚假唤醒(spurious wakeup)atomic#include <iostream>#include <thread>#include<vector>#include<string>#include<queue>#include<mutex>#include<ato

2020-09-25 11:55:20 69

原创 6.1继承体系下对象构造步骤

1.虚函数的继续观察编译器会在构造函数里为虚函数指针赋值,所以:大家千万不要在构造函数中你自己的代码中使用诸如memcpy或者直接操作等手段,如memcpy(this,),(这样可能会修改虚函数表指针的值),导致调用虚函数时就可能造成系统崩溃。2.规则构造函数中调用虚函数,这里没有走虚函数表,而是直接通过虚函数地址,直接调用这个虚函数(静态方式调用)可能是因为还在构造函数中,没有构造完整,不宜采用虚函数表的方式而间接调用(虚函数里套个虚函数2,虚函数2又是虚函数表调用的-.-)...

2020-09-24 20:32:09 58

原创 11.windows临界区,其他各种mutex互斥量

1.windows临界区和c++11中的mutex非常类似#include <iostream>#include <thread>#include<vector>#include<string>#include<queue>#include<mutex>#include<windows.h>using namespace std;#define __WINDOWSJQ__ //一个开关,用window

2020-09-22 12:44:43 184

原创 10.std::atomic续谈,std::async深入谈

1.原子操作std::atomic续谈一般原子操作争对++,–,+=,&=,|=,^=是支持的,其他的可能不支持#include <iostream>#include <vector>#include <ctime>#include<thread>#include<mutex>#include<future>#include<atomic>using namespace std;std::at

2020-09-22 11:26:30 91

原创 9.future其他成员函数,shared_future,atomic

1.future其他成员函数std::future_status::timeout等待1秒,因为线程入口函数要5秒,所以超时了(没有等到)#include <iostream>#include <vector>#include <ctime>#include<thread>#include<mutex>#include<future>using namespace std;int mythread() {//线程入

2020-09-21 17:15:24 140

空空如也

空空如也

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

TA关注的人

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