Linux下C语言版多线程: https://xingzhu.top/archives/duo-xian-cheng
创建进程12#include <thread> // 头文件thread name (function_name, args..);
name:进程名
function_name:函数名字,仿函数
args:函数传的参数
这个函数是在创建线程的时候就执行这个函数
123456789101112void print(string str) { cout << "Hello Thread!" << str << endl; } int main() { // 方式一 thread t1(print, "hh"); // 方式二 thread t1; t1 = thread(print, "hh"); return 0;}
这样实际有问题,有可能编译器 ...
项目:https://xingzhu.top/archives/webfu-wu-qi-xiao-xiang-mu-linux-c-epoll
HTTP 协议客户端 (浏览器):
通过浏览器地址栏给服务器发送请求,浏览器内部进行数据的封装
根据 http 协议进行封装,封装完毕,数据发送给服务器
等待服务器的回复
收到服务器回复的数据,根据 http 协议解析数据
得到了服务器回复的原始数据
服务器端:
接收数据,被 http 协议封装过的
根据 http 协议解析数据,得到客户端请求的原始数据
处理客户端请求,得到处理结果
给客户端回复数据,(数据需要通过 http 协议进行封装,然后在发送给客户端)
http 协议封装好数据之后是一个数据块,得到若干行数据,使用的换行符 \r\n
http 请求http 请求消息分为四部分:
请求行;不管 get 请求还是 post 请求,请求行是分为三部分
请求头
空行
客户端向服务器提交的数据
get 方式提交数据
如果使用 get 的方式向服务器提交数据,数据并没有在请求协议的第四部分,而是在请求行的第二部分
...
基本用法12// 语法格式[capture](params) opt -> ret {body;};
其中 capture 是捕获列表,params 是参数列表,opt 是函数选项,ret 是返回值类型,body 是函数体
捕获列表 [] :捕获一定范围内的变量
参数列表 ():和普通函数的参数列表一样,如果没有参数参数列表可以省略不写
opt 选项, 不需要可以省略
mutable:可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
exception:指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw();
返回值类型:在 C++11 中,lambda 表达式的返回值是通过返回值后置语法来定义的
函数体:函数的实现,这部分不能省略,但函数体可以为空
捕获列表
[] 不捕捉任何变量
[&] 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
[=] 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
拷贝的副本在匿名函数体内部是只读的
[=, &foo] 按值捕获外部作用 ...
可调用对象
通俗来说,就是创建一个可以当函数作用一样调用的对象
包含一下几种:
是一个函数指针
是一个具有 operator() 成员函数的类对象(仿函数)
是一个可被转换为函数指针的类对象
是一个类成员函数指针或者类成员指针
函数指针123456789int print(int a, double b) { cout << a << " " << b << endl; return 0;}// 定义函数指针int (*func)(int, double) = &print;// 调用(*func)(10, 20);func(10, 20);
这里两种皆可
第一种很好理解,就是定义了一个指针指向函数地址,这里加不加 & 都一样,因为函数名就是地址,然后调用的时候进行解引用就拿到函数地址,就能进行调用了
第二种是 C++ 的简化,C++编译器允许直接使用函数指针进行调用,而不需要显式地解引用。编译器会自动理解 func(10, 20) 是通过函数指针 func ...
智能指针
注意智能指针管理的是动态分配的内存,即堆区的数据,栈上的会有问题
1#include <memory> // 智能指针的公用头文件
shared_ptr 共享
共享指针(是指可以多个 shared_ptr 指向同一块内存,进行管理)
好处:
方便调用,重要的是防止内存泄漏
因为我们自己定义指针,new 出空间,就得手动释放,但是智能指针是一个模板类,封装好了的,当不需要的时候,会在智能指针生命周期结束后自动释放内存
比如定义在函数里,函数结束,它就结束,自动释放内存,还比如它不再指向内存空间了,就自动释放内存,指向空
初始化默认构造函数
123// shared_ptr<T> 类模板中,提供了多种实用的构造函数, 语法格式如下:std::shared_ptr<T> 智能指针名字(创建堆内存);shared_ptr<int> ptr1(new int(520));
std::make_shared
1234567891011template< class T, class... Args >shared ...
消息队列消息队列是一种进程间通信(IPC)机制,允许进程以消息的形式传递数据。它通过在内核中维护的队列实现,提供了异步通信的能力。消息队列由键值唯一标识,支持一个或多个进程之间的数据传输。
相关函数msgget
功能:创建或获取一个消息队列
函数原型:
1int msgget(key_t key, int msgflg);
参数:
key:消息队列的键即标识,可以通过 ftok 生成
msgflg:访问权限。
IPC_CREAT —— 如果 key 不存在,则创建
IPC_EXCL —— 如果 key 存在,则返回失败
返回值:成功返回消息队列标识符(非负整数),失败返回 -1
msgsnd
功能:向消息队列发送消息
原型:
1int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数:
msqid:消息队列标识符,也就是上述创建的返回值
msgp:指向消息的指针,是个结构体,但需要自己手动定义(放下面了)
msgsz:消息正文的大小(不包括消息类型)
msgflg:操作标志(如 ...
DDL:用于定义和管理数据库结构(如创建、修改、删除表等)
DML:用于对表中的数据进行增删改
DQL:用于查询数据
DDL数据库操作
查询所有的数据库:
1show databases;
查询当前数据库是哪个:
1select database();
创建:
1create database [if not exists] 数据库名 [default charset 字符集](collate 排序规则)
删除:
1drop database [if exists] 数据库名;
使用某个数据库:
1use 数据库名
表操作
查询当前数据库的所有表:
1show tables;
查询表结构:
1desc 表名;
创建:
123456create table ( 字段1 字段1类型 (comment 字段 1 注释), 字段2 字段2类型 (comment 字段 2 注释), ...... )(comment 表注释);create table 表名 as select *from 另一张表名 ----- 复制另一张 ...
Linux
未读
初始化配置配置用户名
1git config --global user.name "Your Name"
配置邮箱
1git config --global user.email "mail@example.com"
存储配置(存储用户名邮箱)
1git config --global credential.helper store
创建仓库创建一个新的本地仓库 (省略 project-name 则在当前目录创建)
1git init <project-name>
克隆一个远程仓库
1git clone <url>
四个区域
区域
功能
工作区
在电脑里实际能看到的目录,也就是仓库的所在地
暂存区
暂存区也叫索引,用来临时存放未提交的内容,一般在 .git 目录下的 index 中
本地仓库
Git 在本地的版本库,仓库信息存储在 .git 这个隐藏目录中
远程仓库
托管在远程服务器上的仓库,如 GitHub
文件状态
状态
描述
已修改
修改了但是没有保存到暂存区的文件
...