c++并发编程(中)
1. 内存顺序和内存模型使用实现1.1 sequencial consistent模型(最严格的)memory_order_seq_cst代表全局一致性顺序,可以用于 store、 load 和 read-modify-write 操作实现 sequencial consistent的顺序模型。在这个模型下, 所有线程看到的所有操作都有一个一致的顺序,即使这些操作可能针对不同的变量,运行在不同的线程。
在下面程序中,线程1修改完x和y的值,线程2立刻就能见到x和y修改的值,所以当线程2读到y为true时就会退出循环,然后读到的x也一定为true。因为需要保证与线程1修改顺序是一致的,线程1修改了x再修改y,当线程1修改完y的时候,x早就被修改为true了,所以当线程2读到了y为true时,接下来读到的x也一定为true。这样的话,z就是从0变为1,就不会发生断言。
1234567891011121314151617181920212223242526std::atomic<bool> x, y; //定义两个bool类型的原子变量std::atomic<i ...
结合epoll和http实现B/S模式
1. 简介epoll 是linux下的一个 I/O 多路复用机制,用于高效地监听多个文件描述符上的 I/O 事件。相较于 select 和 poll,epoll 在处理大量连接时具有更好的性能。而HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。它也是基于B/S架构进行通信的,下面就结合epoll来实现一个能够给浏览器提供服务,供用户借助浏览器访问服务器主机中文件的B/S模式。
2. 代码实现2.1 主函数主函数主要负责把启动程序时,传进来的参数用变量来接收,并检测,当传进来的参数不满3个时,就会报错,最后传入端口,来调用一个监听函数。
123456789101112131415161718int main(int argc, char *argv[]){ //命令行参数获取 端口和server提供的目录 if(argc < 3){ printf("server port path\n"); ...
c++并发编程(上)
1. 线程基础1.1 线程发起线程发起就是指启动一个线程,C++11标准统一了线程操作,可以在定义一个线程变量后,该变量启动线程执行回调逻辑。
12345678void thead_work1(std::string str) { std::cout << "str is " << str << std::endl;}int main(){ std::string hellostr = "hello world!"; //定义一个字符串 std::thread t1(thead_work1, hellostr); //通过()初始化并启动一个线程 t1.join(); //主线程等待子线程退出}
在上面程序中,如果没有t1.join();或用std::this_thread::sleep_for(std::chrono::seconds(1 ...
linux网络编程小项目-在线词典
1. 项目概述在线词典项目是在linux系统下结合c语言、网络编程和sqlite3数据库等技术来实现的一个在线的英译英单词解释,当客户端成功连接到服务器后,客户端登录账号后输入想查询的单词,服务器端会在词库(网上找的)中寻找这个单词的解释并发送给客户端,从而实现在线查询。服务端同时也会向数据库存储该用户的一个查询记录,方便管理的同时,也方便客户端查询。
12345678910//编译时:gcc word_server.c -o word_server -lsqlite3//创建数据库,在终端输入://sqlite3 my.db//create table use(name text primary key, pass text);//create table record(name text , data text, word text);//.schema//.quit//delete from record; //删除记录表里面的内容//select * from record; //查询记录表里面的内容
流程:
1.服务器绑定好IP和端口 ...
grpc在windows环境下的配置与编译
1. 简介gRPC(全称为gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架。由Google开发,gRPC基于HTTP/2协议,并使用Protocol Buffers(Protobufs)作为接口描述语言。以下是gRPC的一些关键特性和优势:
高性能:gRPC利用HTTP/2的特性,例如多路复用和二进制协议,提高了传输效率和性能。
多语言支持:gRPC支持多种编程语言,包括C++、Java、Python、Go、Ruby、C#等,使得开发人员可以在不同的编程环境中使用它。
简化开发:通过使用Protobufs,gRPC提供了一种简洁和高效的方式来定义服务接口和消息结构。
双向流:gRPC支持客户端和服务器之间的双向流通信,使得它在需要实时通信的应用场景中表现尤为出色。
负载均衡和命名解析:gRPC内置了负载均衡和命名解析功能,使其更易于在分布式系统中使用。
1.1 主要组成部分
服务定义:开发者使用Protobufs定义服务和消息。
客户端和服务器代码生成:gRPC使用Protobufs定义生成相应的客 ...
butterfly主题美化
1. 页面底部footer跳动的心1.1 步骤编辑C:\blog\themes\Butterfly\layout\includes\footer.pug文件
1.将以下内容:
1©${theme.footer.owner.since} - ${nowYear} By ${config.author}
改为:
1©${theme.footer.owner.since} - ${nowYear + ' '} <i id="heartbeat" class="fa fas fa-heartbeat"></i> ${config.author}
2.将以下内容:
1©${nowYear} By ${config.author}
改为:
1©${nowYear + & ...
boost库asio编程(下)
1. beast网络库搭建http服务器1.1 简介通过asio来实现http服务器也需要严格服从http报文头的格式,其实http报文头的格式就是为了避免我们之前提到的粘包现象,告诉服务器一个数据包的开始和结尾,并在包头里标识请求的类型如get或post等信息。一个标准的HTTP报文头通常由请求头和响应头两部分组成。
http请求头格式:
123456GET /index.html HTTP/1.1 //包含用于描述请求类型、要访问的资源以及所使用的HTTP版本的信息。Host: www.example.com //指定被请求资源的主机名或IP地址和端口号。Accept: text/html, application/xhtml+xml //指定客户端能够接收的媒体类型列表,用逗号分隔,例如 text/plain, text/html。User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0 //客户端使用的浏览器类型和版本 ...
boost库asio编程(中)
1. asio的通信流程首先是在应用层调用async_read()函数,就相当于是往io_context里面注册读事件,并且注册读回调函数。然后io_context会把对应的读事件、socket和回调都写到epoll模型或iocp模型里,即注册给这两个模型。而在应用层调用io_context.run的时候,实际上是一个死循环,它会调用linux的epoll模型或windows的iocp模型,以死循环的方式不断的轮询,不断的去检测我们注册的那些socket那些就绪了
如果有socket就绪了,比如说我们注册了一个socket监听对端的一个发送事件,对端发送过来了,我们这个读事件就会就绪了。读事件就绪的话,就会把读事件对应的回调函数写到就绪的队列里。如果是单线程的话,这些事件的回调函数放到就绪的队列里,系统直接就会把就绪队列里的回调函数一个一个取出来,按顺序来给我们回调,顺序就是我们在底层去轮询,发现哪个socket回调函数先就绪了,就先放到就绪队列里。如果是写的事件,它也会被放到该就绪队列里,最后由asio统一派发。
2. 字节序处理2.1 字节序的问题在计算机网络中,由于不同的计算机 ...
boost库asio编程(上)
1. boost库1.1 概述网络编程是现代软件开发中无可替代的一环,无论是构建庞大的分布式系统还是小型的桌面应用,都离不开网络的支持。Boost.Asio起源于Boost库,是一款专为网络I/O、定时器、串行端口通信设计的库,提供了同步和异步的编程模型,用以简化网络和低级I/O的操作。它的设计初衷是提供一套简洁、一致且功能全面的接口,以满足开发者在多样化网络编程场景下的需求。
随着网络技术的发展,现在大部分用的都是一些多路复用的模型,比如说epoll、select。boost.asio在windows层面,它用的是iocp这种多路复用的模型,在linux层面是用epoll来封装的。在最后它是通过proactor这种设计模式来实现封装,里面是异步操作,我们也不需要手动去读写,proactor是纯异步处理的方式,我们只需要传入数组对应的一段连续空间,在底层的网络模型就会帮我们把数据读好。
还有一种Reactor模式,IO复用结合线程池就是Reactor模式基本设计思想。Reactor模式是同步模型,proactor模式是异步模型
websocket其实是通过TCP ...
高并发网络编程libevent
1. libevent库介绍1.1 什么是libeventlibevent也称为事件通知库,即所见皆事件,是一个用C语言实现的、基于事件驱动(event-driven)的轻量级高性能开源网络库,适用于Windows、Linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。libevent不一定是用到网络当中,本地的文件描述符都可以用。
1.2 libevent特点
事件驱动(event-driven),高性能
轻量级,专注于网络,不如 NGINX 那么臃肿庞大
源代码相当精炼、易读
跨平台,支持 Windows、Linux、*BSD和Mac OS,但Windows支持不怎么好
支持多种I/O多路复用技术,select、epoll、poll、dev/poll、select、kqueue、evports等
支持I/O,定时器和信号等事件
采用Reactor设计模式
支持HTTP(S),DNS解析
libevent是用于编写高速可移植非阻塞IO应用的库,其设计目标是:可移植性、高性能、便携和可扩展性
...