C++linux后台开发入门
文章平均质量分 69
C++linux后台开发入门
拾牙慧者
会点c++、python;
展开
-
__builtin_xxx指令学习【5】__builtin_bswap16/32/64
__builtin_bswap16/32/64是GCC和Clang编译器提供的内置函数,用于交换一个整数的字节顺序。其中,__builtin_bswap16用于交换一个16位整数的字节顺序,__builtin_bswap32用于交换一个32位整数的字节顺序,__builtin_bswap64用于交换一个64位整数的字节顺序。这些函数的使用背景是在一些网络编程和底层编程中,需要对字节序进行处理和转换,而交换字节顺序是一个常见的操作原创 2023-04-08 17:33:16 · 2496 阅读 · 0 评论 -
__builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll
__builtin_clz是GCC和Clang编译器提供的一个内置函数,用于计算一个整数的二进制表示中,从最高位开始连续的0的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析。原创 2023-04-08 17:29:15 · 3010 阅读 · 0 评论 -
__builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll
__builtin_popcount是GCC和Clang编译器提供的一个内置函数,用于计算一个整数中二进制位为1的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析原创 2023-04-08 17:30:23 · 796 阅读 · 0 评论 -
__builtin_xxx指令学习【2】__builtin_prefetch
__builtin_prefetch是GCC编译器提供的一个内置函数,用于预取数据到CPU的缓存中,以便提高程序的执行效率原创 2023-04-08 17:25:47 · 1987 阅读 · 0 评论 -
__builtin_xxx指令学习【1】__builtin_expect
__builtin_expect是GCC编译器提供的一个内置函数,用于告诉编译器一个分支的执行概率,以便编译器在生成机器码时进行优化。原创 2023-04-08 16:47:06 · 752 阅读 · 0 评论 -
C++实现读写分离的双缓冲buffer
读写分离的双缓冲buffer有以下好处:1. 提高了并发读写的效率:在多线程环境下,读写操作是相互竞争的,读写分离的双缓冲buffer可以有效地减少读写之间的竞争,提高并发读写的效率。2. 减少了数据的拷贝:双缓冲buffer可以将数据从写缓冲区直接拷贝到读缓冲区,避免了中间数据拷贝的过程,提高了数据读写的效率。3. 提高了数据的安全性:双缓冲buffer可以避免读写操作的交叉,从而保证了数据的安全性。4. 提高了系统的稳定性:双缓冲buffer可以避免读写操作的阻塞,从而提高了系统的稳定性和可靠性原创 2023-03-22 23:20:48 · 2768 阅读 · 0 评论 -
linux进程间通信快速入门【三】:信号量(XSI、POSIX以及PV原语)
在前两篇文章中我们使用的racingdemo都没有对临界区代码进行加锁,这里我们介绍以下信号量的使用。Linux环境下主要实现的信号量有两种。根据标准的不同,它们跟共享内存类似,一套XSI的信号量,一套POSIX的信号量。下面我们分别使用它们实现一套类似文件锁的方法,来简单看看它们的使用。参考https://zorrozou.github.io/docs/books/linuxde-jin-cheng-jian-tong-4fe1-xin-hao-liang.html...原创 2022-03-28 19:10:27 · 2060 阅读 · 0 评论 -
linux进程间通信快速入门【二】:共享内存编程(mmap、XSI、POSIX)
使用文件或管道进行进程间通信会有很多局限性,比如效率问题以及数据处理使用文件描述符而不如内存地址访问方便,于是多个进程以共享内存的方式进行通信就成了很自然要实现的IPC方案。LInux给我们提供了三种共享内存的解决方案:mmap内存共享映射。XSI共享内存。POSIX共享内存。mmap内存共享映射mmap可以将一个文件映射到内存中,在程序里就可以直接使用内存地址对文件内容进行访问,这可以让程序对文件访问更方便。API:#include <sys/mman.h>void *m原创 2022-03-18 15:30:30 · 1441 阅读 · 0 评论 -
linux进程间通信快速入门【一】:管道编程
介绍 管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。 这样前面写完后面读,于是就实现了通信。虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。 在Linux的实现上,它占用的是内存空间。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。 管道分类:匿名管道、命名管道命令行中使用1、mkfifo或mknod命令来创建一个命名管道[root@VM-90-225-centos ~]# mkfifo pipe[root@VM-90-225原创 2022-03-12 16:22:04 · 1751 阅读 · 0 评论 -
c++实现简单线程池代码
目录完整代码TaskPool.cppTaskPool.hmain.cpp完整代码TaskPool.cpp//// Created by LENOVO on 2021/10/25.//#include "TaskPool.h"#include <functional>std::mutex printMutex;TaskPool::TaskPool() : m_bRunning(false){}TaskPool::~TaskPool(){ remove.原创 2021-10-25 16:30:21 · 375 阅读 · 0 评论 -
C++多线程快速入门(五)简单线程池设计
目录设计思路主线程运行逻辑task以及taskpool设计详细流程讲解完整代码打印结果往期回顾设计思路线程池实际上就是一组线程,当我们需要异步执行一些任务时,经常要通过OS频繁创建和销毁线程,不如直接创建一组在程序生命周期内不会退出的线程。当有任务需要被执行时,线程可以自动地去拿任务并执行,在没有任务时,线程处于阻塞或者睡眠状态。我们选择队列存放任务,main函数中的thread作为任务的生产者,从队列尾部插入任务。线程池中的线程作为消费者,从队列头部获取任务。复杂考虑的话,当线程池的线程在处.原创 2021-10-25 19:25:26 · 777 阅读 · 0 评论 -
C++多线程快速入门(四)shared_mutex以及读写锁应用
在前面的三讲中我们使用的mutex都是普通的std::mutex,这里介绍一下shared_mutex,版本为C++17std::shared_mutex的底层实现时操作系统提供的读写锁,在读多写少的情况下,该shared_mutex比mutex更加高效。它提供了常用的四种方法:lock和unlock分别用于获取写锁和解除写锁lock_shared和unlock_shared分别用于获取读锁和解除读锁写锁模式称为排他锁,读锁模式称为共享锁。c++11和c++14标准中分别引入unique_loc原创 2021-10-24 21:10:44 · 3304 阅读 · 0 评论 -
C++多线程快速入门(三):生产者消费者模型与条件变量使用
互斥锁完成#include <iostream>#include <deque>#include <thread>#include <mutex>std::deque<int> q;std::mutex mtx;static void produce(int val) { while(val--) { std::unique_lock<std::mutex> guard(mtx);原创 2021-10-23 14:37:51 · 378 阅读 · 0 评论 -
C++多线程快速入门(二)共享数据同步以及数据竞争
仅调用一次程序免不了要初始化数据,线程并发没有某种同步手段来控制,会导致初始化函数多次运行。c++11种提供仅调用一次的功能,首先声明一个once_flag类型的变量作为初始化标志,最好是静态、全局的,这样对于线程就是可见的了。然后调用专门的call_once()函数,以函数式编程的方式,传递这个标志和初始化函数,这样就可以保证,即使多个线程重入call_once(),也只能由一个线程会成功初始化#include <iostream>#include <thread>#in原创 2021-10-22 20:58:34 · 763 阅读 · 0 评论 -
C++多线程快速入门(一):基本&常用操作
目录case1:创建线程1 join、detachcase2:创建线程2 线程传参 传值或者传引用case3:创建线程 线程传参 仿函数作为参数case1:创建线程1 join、detach创建线程,并等该线程执行完毕,并且打印两个线程的id#include <iostream>#include <thread>using namespace std;void func() { cout << "hello , this is my thread,.原创 2021-10-21 18:57:55 · 972 阅读 · 0 评论 -
C++网络编程快速入门(四):EPOLL模型使用
目录基本使用方法step1:创建epollfdstep2:将fd绑定到epollfdstep3:调用epoll_wait检测事件epoll_wait与poll、select区别所在水平触发与边缘触发基本使用方法step1:创建epollfd创建一个epollfd,若epoll_create调用成功,则返回一个非负值的epollfd,否则返回-1/* Creates an epoll instance. Returns an fd for the new instance. The ".原创 2021-10-30 21:28:49 · 2153 阅读 · 0 评论 -
C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数
阻塞与非阻塞阻塞模式指的是当前某个函数执行效果未达预期,该函数会阻塞当前的执行线程,程序执行流在超时时间到达或者执行成功后恢复原有流程。非阻塞模式相反,即使某个函数执行结果未达预期,该函数也不会阻塞当前执行线程,而是立即返回。网络socket编程中,常见的connect、accept、send、recv函数均具有阻塞与非阻塞两种调用方式。阻塞与非阻塞socket具有各自适用的场景非阻塞模式一般用于需要支持高并发QPS的场景,但是该模式会让程序执行流和控制逻辑变复杂。阻塞模式逻辑简单,结构简单。s原创 2021-10-30 13:55:19 · 2954 阅读 · 0 评论 -
C++网络编程快速入门(二):Linux下使用select演示简单服务端程序
select参数解释extern int select (int __nfds, fd_set *__restrict __readfds, fd_set *__restrict __writefds, fd_set *__restrict __exceptfds, struct timeval *__restrict __timeout);__nfds:一般设置为所有需要使用select函数检测时间的fd中的最大值+1__readfds:需要监听可读事件的原创 2021-10-28 17:12:38 · 976 阅读 · 0 评论 -
C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用
流程概述客户端与服务器之间的网络通信基本原理如下所示,复杂一点的架构可能会添加消息中间件。对于服务端,通信流程如下:1、调用socket函数创建监听socket2、调用bind函数将socket绑定到某个IP和端口号组成的二元组上3、调用listen函数开启监听4、当有客户端连接请求时,调用accept函数接受连接,产生一个新的socket(与客户端通信的socket)5、基于新产生的socket调用send或recv函数开始与客户端进行数据交流6、通信结束后,调用close函数关闭sock原创 2021-10-26 21:32:51 · 6037 阅读 · 0 评论