自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 资源 (1)
  • 收藏
  • 关注

原创 core dump查看

core dump查看@(论文笔记本)core dump表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试。##1、应用场景程序报错:Segmentation fault (core dump)##2、使用core dump打开core dumpulimit -c unlimited这条命令是在当前的终端环境开启core dump功能,并且不限制core dump文件的大小。如果需要永久生效,就得去修改/etc/security/limits.

2021-11-03 10:38:40 2584

原创 条款05:了解C++默默编写并调用了哪些函数

条款05:了解C++默默编写并调用了哪些函数@(EffectiveCpp)如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数,一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数,编译器也会声明一个default构造函数。因此:class Empty{};等同于:class Empty{public: Empty(){...}//default构造函数 Empty(const Empty& rhs){...}//c

2021-10-29 17:36:03 177

原创 单例模式模板类

单例模式模板类@(C/C++学习笔记)模板类#if defined(__SUPPORT_TS_ANNOTATION__) || defined(__clang__)#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))#else#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op#endif#define GUARDED_BY(x) THREAD_ANNOTATION_

2021-10-27 15:31:24 368

原创 使用CMakeLists.txt和vscode的muduo环境设置

使用CMakeLists.txt的muduo环境设置@(CMake笔记)1、CMakeLists.txt下面的编写方式可以通过cmake . -DCMAKE_BUILD_TYPE=Release或者cmake . -DCMAKE_BUILD_TYPE=Debug选择使用release模式生成的muduo还是debug模式生成的muduo。#声明要求的cmake版本cmake_minimum_required(VERSION 3.10)# 工程名project(setConfiugre)#

2021-10-26 21:21:50 511

翻译 CMake中的编译类型

CMake中的编译类型(Release  DebugRelease\;DebugReleaseDebug)@(CMake笔记)参考:Build types in CMake一个编译类型[Build Type]意味着一系列在编译代码时用到的编译期设置。比如是否要进行优化,或者是否要包含调试信息。编译类型或者说编译模式[Build Mode],又或者设置[confiuration]在VS中相当广泛,在VS中C++工程至少有两种编译类型:Release和DebugRelease和DebugRelease

2021-10-23 18:31:35 1143

原创 s2017远程ubuntu18.04断点无法触发的问题

#20211019 vs2017远程ubuntu18.04断点无法触发的问题文件名不要用中文。

2021-10-19 22:02:27 93

原创 条款30 透彻了解`inline`的里里外外

20211009 条款30 透彻了解inline的里里外外1 一开始不要设置inline,或将inline的使用范围限制在极其简短又十分平淡无奇的函数身上。inline函数无法随程序库的升级而升级比如 f是程序库内的一个inline函数,客户将“f函数本体”编进其程序中,一旦程序库设计者决定改变f,所有用到f的客户端程序都必须重新编译。然而如果f是non-inline函数,一旦它有任何修改,客户端只需重新连接就好,远比重新编译的负担少很多。如果程序库采取动态连接,升级版函数甚至可以不知不觉地被应

2021-10-09 14:38:36 102

原创 网络库缓冲区实践思路

网络库缓冲区实践思路@(网络编程实现)下面给出的是借鉴于muduo::Buffer的非阻塞I/O,TCP套接字的缓冲区设置。关键字:非阻塞网络、TCP、多连接、简单为什么需要缓冲区为什么需要输出缓冲区受限于TCP协议,应用程序要发送的数据可能无法一次发送完成。在这种情况下,应用程序不可能阻塞在发送端口上。这就需要缓冲区暂时保存还未发送的数据,待套接字可写时再又网络库发送。为什么需要输入缓冲区应用程序只关心消息到达,而不关心数据到达;TCP协议是无消息边界的字节流协议。

2021-09-29 20:27:27 144

原创 TcpConnection的上下文

#20210917 TcpConnection的上下文如有问题,欢迎交流!上下文相关API:void TcpConnection::setContext(const boost::any& context){context_ = context;}boost::any* TcpConnection::getContext() const{return context_}解释:用于记录本次和本次连接密切相关的信息...

2021-09-17 15:56:50 152

原创 条款04:确定对象在使用前已被初始化

#条款04:确定对象在使用前已被初始化如有问题,欢迎交流指正永远在使用对象之前先将它初始化,特别是内置类型。构造函数的初始化任务使用member initialization listmember\,initialization\, listmemberinitializationlist替换函数体中的赋值动作。C++规定,对象的成员变量的初始化动作发生在进入构造函数函数体之前。规定总是在初值列中给出所有成员变量,以免还得记住哪些成员变量无需初值。如果类中存在多个构造函数,为避免初值列中

2021-08-28 09:46:29 113

原创 TCPServer Class源码阅读(muduo::net)

#TCPServer Class源码阅读(muduo::net)跟着大佬走,走的就是快呀TCPServer是服务器类,直接提供给用户使用,用户通过注册回调函数来实现业务逻辑。数据成员EventLoop* loop_本TCPServer Class对象所属EventLoop对象const string ipPort_字符串类型的ip地址和端口号cosnt string name_名称,用于输出调试信息std::unique_ptr<Acceptor>

2021-08-24 21:12:27 150

原创 EventLoopThreadPool Class源码阅读(muduo::net)

#EventLoopThreadPool Class`源码阅读(muduo::net)如果有问题,欢迎交流!!!数据成员EventLoop* baseLoop_EventLoopTreadPool Class对象所在loop。有些成员函数在执行前要检查当前是不是在baseLoop_所在线程string name_用于给一众EventLoopThread命名int numThreads_创建的线程数量next_下一个EventLoop对象std::vec

2021-08-24 18:38:11 87

原创 EventLoopThread源码阅读(muduo::net)

#20210824 EventLoopThread源码阅读(muduo::net)如果有问题,欢迎交流!!!EventLoopThread Class创建一个线程执行loop()循环,并返回该EventLoop对象的地址。EventLoopThread Class控制其创建的线程和loop()循环的生命期。数据成员EventLoop* loop_本EventLoopThread Class所创建的EventLoop对象所在的地址bool exiting_初始化为false,析构函

2021-08-24 16:39:30 83

原创 InetAddress Class源码阅读(muduo::net)

InetAddress Class源码阅读(muduo::net)如果有问题,欢迎交流对网络地址的封装。数据成员union{stuct sockaddr_in addr_;struct sockaddr_in6 addr6_;}也就是说,对于一个InetAddress Class类型的对象来说,它既可以是一个ipv4,也可以是一个ipv6。反正大多数基本api输入的参数都要sockaddr,然后自己检查类型。我们可以先获取addr_,然后再根据sin_family做最终确定。就像socket

2021-07-26 11:15:43 119

原创 Socket Class源码阅读(muduo::net)

Socket Class源码阅读(muduo::net)如果有问题,欢迎交流指正!!!基于RAIIRAIIRAII机制对套接字的封装。数据成员const int sockfd_在构造函数中初始化(拷贝初始化,不涉及调用socket(2)的操作),在析构函数中关闭。函数成员int fd()返回套接字bool getTcpInfo(struct tcp_info* tcpi)调用getsockopt获取套接字的信息bool getTcpInfoString(cha

2021-07-26 11:02:57 97

原创 InetAddress Class源码阅读(muduo::net)

InetAddress Class源码阅读(muduo::net)如果有问题,欢迎交流!!!对网络地址的封装。数据成员union{stuct sockaddr_in addr_;struct sockaddr_in6 addr6_;}也就是说,对于一个InetAddress Class类型的对象来说,它既可以是一个ipv4,也可以是一个ipv6。反正大多数基本api输入的参数都要sockaddr,然后自己检查类型。我们可以先获取addr_,然后再根据sin_family做最终确定。就像soc

2021-07-24 20:43:18 138

原创 sockets namespace源码阅读(muduo::net::SocketsOps)

sockets namespace源码阅读(muduo::net)@(Linux多线程服务端编程:使用muduoC++网络库读书笔记)对套接字基本api比如connect、bind、listen等的封装。还有一些负责类型转换的函数。sockaddr* sockaddr_cast一系列的重载还是,负责将输入的或是sockaddr_in,或是sockaddr_in6类型的地址调用隐式类型转换转换为sockaddr。sockaddr_in* sockaddr_in_cast负责将sock

2021-07-24 19:38:07 106

原创 Timestamp Class源码阅读

Timestamp Class源码阅读如有问题,欢迎交流!!!微秒精度的epoch时间。只有一个数据成员,就是这个时间,然后围绕这个时间提供了一系列功能。这个epoch时间计算的是以1970年为基准的时间,主要由定时器调用,所以不必担心数值过大的问题。数据成员microSecondsSinceEpoch_这就是那个微妙时间,只有这一个数据成员。在构造函数中初始化。函数成员该函数外,重载了相关的比较运算符。string toString()将微秒时间转换为字符串类型的秒s

2021-07-17 11:23:33 137

原创 BoundedBlockingQueue Class源码阅读(muduo/base)

BoundedBlockingQueue Class源码阅读(muduo/base)如果有问题,欢迎交流!!!阻塞队列模板类的有限版本,其队列大小在构造函数中被初始化,并定义了用于判断队列空或满的函数,而且其队列大小确定后不能改变。数据成员template<typename T>boost::circular_buffer<T> queue_队列,但这个类型是什么?一个环状的缓冲区Condition notEmpty_条件变量,用于通知队列非空C

2021-07-16 20:56:40 84

原创 BlockingQueue Class源码阅读

BlockingQueue Class源码阅读如果有问题,欢迎交流!!!阻塞队列,干嘛的?BlockingQueue Class是一个模板类,会将类型为T的对象保存,或弹出。用来干嘛?数据成员template<typename T>Condition notEmpty_条件变量,用于通知阻塞线程,队列非空。因为这个队列大小是不设限制的,所以不需要额外的条件变量通知线程已满。std::deque<T> queue_保存类型为T的对象的队列mutab

2021-07-16 20:43:40 70

原创 ThreadPool Class源码阅读

ThreadPool Class如果有问题,欢迎交流!!!线程池,维护一个业务函数序列,创建线程池并逐一执行业务函数。数据成员Condition notEmpty_条件变量,用于通知线程序列非空Condition notFull_条件变量,用于通知线程序列未满std::deque<std::function<void()>> queue_业务函数序列mutable MutexLock mutex_锁,保护条件变量notEmpty_、

2021-07-16 10:39:28 123

原创 Thread Class源码阅读

Thread Class源码阅读(muduo/base/Thread)如有问题,欢迎交流!!!Thread Class是对<pthread.h>下线程的封装,使用默认线程属性。相关类型和函数void* startThread(void* obj)这就是对执行线程函数的第二层封装,在其内部调用线程函数的封装ThreadData::runInThread()。struct ThreadData这是线程函数startThread的参数类型。std::function&l

2021-07-14 13:06:17 170

原创 namespace CurrentThread源码阅读

namespace CurrentThread源码阅读如有问题,欢迎交流!!!该命名空间定义了一系列,线程空间下的全局全局变量,比如线程ID、线程名等,提供给诸如日志撰写等功能函数调用。数据成员extern __thread int t_cachedTid通过syscall(SYS_gettid)获取的全局唯一的线程ID。extern __thread char t_tidString[32]通过将CurrentThread::t_cachedTid字符串化获得。exter

2021-07-14 11:56:34 139

原创 Condition Class (muduo/base/Condition.h)& MutexLock Class,MutexLockGuard Class(muduo/base/Mutex.h)详解

Condition Class (muduo/base/Condition.h)& MutexLock Class,MutexLockGuard Class(muduo/base/Mutex.h)源码阅读如有问题,欢迎交流!!!MutexLock Class单纯是对<pthread.h>下锁的封装,但是在.h文件中有很多宏定义。MutexLock Class有两个数据成员:锁,pthread_mutex_t mutex_和持有锁的线程,pid_t holder_。该类在原有<

2021-07-13 16:34:06 171

原创 EventLoop Class源码阅读

#EventLoop Class源码阅读这部分有点复杂,欢迎大家交流事件循环,服务器代码main函数最后的while循环。负责调用Poller监听触发的事件,调用Channel::handleEvent处理就绪的事件。数据成员bool looping_是否正在进行事件循环,在构造函数中初始化为false,在EventLoop::loop()中初始化为true。bool std::atomic<bool> quit_;原子型变量,初始化为false,EventLoop:

2021-07-06 20:48:02 108

原创 TimerQueue Class源码阅读

TimerQueue Class源码阅读@(Linux多线程服务端编程:使用muduoC++网络库读书笔记)文章目录`TimerQueue Class`源码阅读`Timer Class`源码阅读数据成员函数成员`TimerId Class`数据成员函数成员`TimerQueue Class`数据成员函数成员TimerQueue Class封装了基于timerfd的计时器,可是它承担什么工作呢?单纯是确定当前的时间吗?超时回调,超时的时候进行什么工作吗?它来帮助epoll实现0轮询吗?TimerQue

2021-07-06 19:07:19 246

原创 Channel Class详解&源码阅读

Channel Class源码阅读欢迎交流!!!Channel Class封装关心的文件描述符、关心的事件和对应的处理函数。该对象的实例只能在所属的EventLoop中被调用,所以不需要考虑线程安全问题。数据成员loop_该对象的实例所在的EventLoopfd_该对象关心的文件描述符events_该对象关心的事件revents_触发的事件index_标识,标定当前channel处于未被监视、不关心事件,被监视未被监视、不关心事件,被监视未被监

2021-06-30 20:24:55 224

原创 EPollPoller Class详解&源码阅读

EPollPoller Class源码阅读如有问题,欢迎交流EPollPoller Class是以Poller Class为基类,基于epoll(4)封装I/O多路复用I/O多路复用I/O多路复用的具体类。数据成员EventLoop* ownerLoop_本实例所在的EventLoop,继承自基类std::map<int,Channel*> channels_本实例所监视的文件描述符,继承自基类kInitEventListSize = 16用于初始化触发事

2021-06-30 19:25:11 155

原创 PollPoller Class详解/源码阅读(muduo/net/poller)

PollPoller Class源码阅读(muduo/net/poller)@(如有问题欢迎交流)PollPoller Class是基于poll(2)的I/O复用I/O复用I/O复用具体类,以Poller Class为基类。数据成员EventLoop* ownerLoop_继承于基类,通过构造函数初始化std::map<int, Channel*> channels_继承于基类std::vector<struct pollfd> pollfds_

2021-06-29 15:19:18 109

原创 Poller Class详解(muduo/net)

Poller Class详解(muduo/net)@(Linux多线程服务端编程:使用muduoC++网络库读书笔记)Poller Class是一个抽象基类,是对I/O多路复用I/O多路复用I/O多路复用的抽象。它是基于poll(2)的PollPoller Class(muduo/net/Poller)和基于epoll(4)的EPollPoller Class(muduo/net/Poller)的基类。数据成员EventLoop* ownerLoop_Poller所在的EventLoop,P

2021-06-29 11:41:28 127

原创 VS更换远程链接的主机

VS更换远程链接的主机@(编程随笔)添加远程主机工具->选项->跨平台->连接管理器->添加修改远程生成主机项目->属性->配置属性->常规->远程生成主机:

2021-06-17 20:46:19 133

原创 VS2017远程与muduo环境配置方法一 release版

VS2017远程与muduo环境配置方法一 release版@(Linux多线程服务端编程:使用muduoC++网络库读书笔记)具体配置分成三步:安装muduo的头文件到系统目录下安装muduo的库文件到系统目录下设置vs2017的属性表安装muduo头文件到系统目录下拷贝../build/release-install-cpp11/include/muduo到/usr/local/include下安装muduo库文件到系统目录下拷贝../build/release-install

2021-06-17 11:02:16 231

原创 条款03:尽可能使用const

条款03:尽可能使用const@(EffectiveCpp)“只要某个值保持不变是事实,你就该说出来,因为说出来可以获得编译器的帮助,确保这条约不会被违反” ————《Effective C++》以const修饰变量还是很简单的,所以这一条款将大量篇幅用在了讨论const在函数声明中的应用,特别是const member func的内容。文章目录条款03:尽可能使用`const`1,将返回值声明为`const`2,将参数声明为`const`3,`const`成员函数1,将返

2020-12-21 21:42:11 119

原创 条款02:尽量以const,enum,inline替代#define

条款02:尽量以const,enum,inline替代#define@(EffectiveCpp)  新建一个Global.h文件,将本来通过#define定义的变量,用const或enum来定义;将通过#define定义的宏,用模板inline来代替。并将该Global.h包含到所有实现文件中,以模拟#define无视作用域的特点。文章目录条款02:尽量以`const`,`enum`,`inline`替代`#define`1,`#define`的特点2,以`const`,`enu

2020-12-21 21:41:26 117

原创 Git 创建分支操作

Git 创建分支操作@(编程随笔)提出问题我有一个工程,当前阶段的工作已经完成,准备进入下个阶段。我想保留当前阶段的成果,又想在下一个阶段上应用当前阶段的工作,该如何让Git帮助我呢?创建分支参考博客创建与合并分支这位大佬的博客里面有很多有用的东西,有空一定要来拜读一下参考博客git clone 指定分支 拉代码文章目录Git 创建分支操作第一步,直接在原工程所在文件夹创建分支第二步,切换分支第三步,合并分支第四步,分支clone第一步,直接在原工程所在文件夹创建分支git ch

2020-12-21 21:40:27 133

原创 友元

友元友元为类外的函数,和其他类的成员函数提供了一种可以访问类内私有变量的方式。文章目录友元友元函数Problem友元函数 如果一个函数想访问类中的私有成员变量,那他得先被声明为该类的友元(friend + 函数声明)。友元函数并非是类的函数成员,所以它不受说在区域访问控制级别的限制,但是一般声明在public:,声明之前。 要注意,友元声明并不是声明,所以最好还在类所在的头文件之外进行第二次声明(然后顺理成章的和类的成员函数们定义在一起)。 再者,友元函数的定义可以

2020-10-29 09:03:39 321

原创 类中Static Data Member

类中Static Data Member@(C/C++学习笔记)static data member面向整个类,而不是某一个实例。不管该类有没有实例化,该数据成员都得初始化。static data member在头文件中声明,但不能初始化,以避免重定义错误。static data member在.cpp文件中初始化。...

2020-10-24 16:55:07 254

原创 Chapter3 使用名称进行网络访问

Chapter3 使用名称进行网络访问@(TCP/IP Socket编程学习笔记)文章目录Chapter3 使用名称进行网络访问通过`getaddrinfo()`函数实现名称到数值的转换`addrinfo`类型说明客户端通信流程服务器通信流程通过getaddrinfo()函数实现名称到数值的转换int getaddrinfo(const char *hostStr,const char *servieceStr,const struct addrinfo *hints,struct addrinfo

2020-10-16 17:38:15 115

原创 Linux动态库连接后依然报错函数未定义

问题:Linux动态库连接后依然报错函数未定义Date:2020_10_14Environment:LinuxLanguage:C问题详述 首先,我有一个main.c文件,该文件调用了头文件head.c里的第三个函数void thridFunc(SPECType para),head.c里的三个函数通过两个源代码文件定义,并通过如下命令创建动态库:g++ fist.c second.c -fPIC -shared -o libDynamic.so 这一步并无报错!接下来通过如

2020-10-14 20:44:35 1848

原创 Chapter2 基本的TCP套接字

Chapter2 基本的TCP套接字 套接字是一个抽象层,应用程序通过套接字发送或接受数据,其方式类似打开文件句柄写入或读取。TCP/IP中的套接字主要是流套接字和数据报套接字。流套接字基于端到端协议,提供可靠的服务;数据报套接字基于UDP协议,提供尽力而为服务。 一个程序可以对应多个套接字,同样,一个套接字可以对应多个程序。套接字通过Internet地址、协议、端口号唯一标识。文章目录Chapter2 基本的TCP套接字套接字的创建和销毁Internet地址数据结构打印字符到网络

2020-10-12 11:33:53 127

TCP/IP Socket编程,第二章代码实现

Client.out和Server.out分别为客户和服务器的可执行文件。已完成动态链接的操作。其源代码命名和书中的命名一致。

2020-10-12

空空如也

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

TA关注的人

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