自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

请叫我少爷的博客

相信微末的力量

原创 学习muduo库(15)之socket类

UML: 解释: 从逻辑上讲这个类封装的很简单,只有一个私有变量,就是文件描述符,剩下的所有的方法,都是围绕文件描述符来展开的,而且上一篇博客中提到的sochetops.h中的所有函数都是全局函数,而这些全局函数也是在socket类中调用的。 ...

2020-01-09 10:49:00

阅读数 19

评论数 0

原创 学习muduo库(14)之网络编程相关的系统函数SocketsOps.h

SocketsOps.h 在这个头文件中将网络相关的系统函数进行了进一步的封装,这里的函数也都是全局函数。 int socket(int domain, int type, int protocol); •domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET...

2020-01-04 15:00:53

阅读数 15

评论数 0

原创 学习muduo库(14)之eventloopthread类

UML: 解释; 这个类体现了muduo库的思想:每一个线程有且有一个eventloop对象。此类的功能也是,创建一个线程,并在线程的回调函数中创造一个eventloop对象。 值得学习的细节: EventLoop* EventLoopThread::startLoop() { ...

2020-01-02 21:16:51

阅读数 12

评论数 0

原创 学习muduo库(13)之evenloop类中wakeup()的概念

预备知识: eventfd eventfd是Linux 2.6提供的一种系统调用,它可以用来实现事件通知。eventfd包含一个由内核维护的64位无符号整型计数器,创建eventfd时会返回一个文件描述符,进程可以通过对这个文件描述符进行read/write来读取/改变计数器的值,从而实现进程...

2020-01-02 10:19:18

阅读数 34

评论数 0

原创 学习muduo库(12)之定时器相关的类TimerQueue

准备知识: int timer_create(int clockid,int flags); //成功返回0 参数: clockid: 第一个参数一般为CLOCK_REALTIME或者CLOCK_MONOTONIC,其参数意义为参数意义 CLOCK_REALTIME:相对时间,从19...

2019-12-31 09:44:56

阅读数 18

评论数 1

原创 学习muduo库(11)之eventpoll类

预备知识: poll: int poll(struct pollfd fds[], nfds_t nfds, int timeout); 参数: fds:这是一个结构体数组指针。nfds:是这个数组的大小。timeout:表示poll的阻塞时间。 typedef struct pol...

2019-12-27 15:58:23

阅读数 12

评论数 0

原创 学习muduo库(10)之与日志相关的类

准备知识: 标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。 __LINE__ 当前程序行的行号,表示为十进制整型常量 __FILE__ 当前源文件名,表示字符串型常量 另外gcc还支持__fu...

2019-12-26 11:24:05

阅读数 11

评论数 0

原创 学习muduo库(9)之线程单例类ThreadLocalSingleton

准备知识: __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。 __thread使用规则:   只能修饰POD类型(类似整型指针...

2019-12-20 19:06:08

阅读数 11

评论数 0

原创 学习muduo库(8)之线程本地存储类ThreadLocal

预备知识: int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); 第一个参数为指向一个键值的指针,第二个参数指明了一个destructor函数,如果绑定的函数不为空,那么当每个线程结束时,系统将调用这个函数...

2019-12-20 14:42:19

阅读数 12

评论数 0

原创 学习muduo库(7)之单例类Singleton

UML: pthread_once(&ponce_, &Singleton::init); pthread_once(&ponce_, &Singleton::init);是一个线程安全的,且保证Singleton::init仅仅被执行一次。 解释: S...

2019-12-20 09:27:00

阅读数 28

评论数 0

原创 学习muduo库(6)之线程池类ThreadPool

UML: 这是一个十分重要的类,这个类中维护了两个队列,一个是任务队列,一个是线程队列。我们将任务放到任务队列中,线程队列从任务队列中不断地读取任务。线程队列的尺寸是自己定义的,所以线程队列是一个大小固定的队列。任务队列是一个std::deque,我们可以设置它的最大尺寸。两个条件变量是用来...

2019-12-19 21:13:46

阅读数 15

评论数 0

原创 学习muduo库(5)之有界缓冲区类无界缓冲区类BlockingQueue和BoundedBlockingQueue

UML: BlockingQueue 这是一个用std::deque设计的线程安全的队列,其实要想简单的保证队列的线程安全,只需要在读写的时候加上锁就行啦。为了提高效率,这里引入了条件变量。产生的效果就是,当读出数据时,发现这个队列是空的,就把这个线程挂起到条件变量上,当写入数据的时候就唤...

2019-12-19 11:46:58

阅读数 14

评论数 0

原创 学习muduo库(4)之门闩类CountDownLatch

UML: 解释: CountDownLatch类是一个通过条件变量类condition,来实现让多个子线程同时起跑的。其实count_是表示需要建立的线程数,当count_大于零时,线程会被条件变量挂起。每建立一个线程count_都会减一,当最后一个线程建立成功后,count_减为零。这个...

2019-12-19 10:52:43

阅读数 15

评论数 0

原创 学习muduo库(3)之条件变量condition类

预备知识: pthread_cond_t 这是Linux库中的一个变量类型,表示多线程的条件变量,用于控制线程等待和就绪的条件。 pthread_cond_init() muduo库用次函数来初始化条件变量。 它的原型为: extern int pthread_cond_init __...

2019-12-17 17:54:33

阅读数 12

评论数 0

原创 学习muduo库(2)之互斥锁MutexLock类

UML类图: 解释: 供我们使用的是lock()和unlock()这两个函数,与Linux自带的互斥量使用方法类似。 需要解释的是holder_,这个变量使用来记录当时锁住锁的线程的tid,如果没有任何线程锁住锁它的值为0。就是通过这种方式来体现MutexLock的上锁和解锁的。在源码中...

2019-12-17 15:54:56

阅读数 12

评论数 0

原创 学习muduo库(1)之CmakeLists.txt的编写

CMakeLists.txt有很多复杂的写法,尤其是设置一些变量的时候,我这里只写出来最简单的写法,没有变量全部用绝对路径来写,这对新手来说,最友善。 cmake_minimum_required(VERSION 2.6) //限制最低版本 project(pas CXX) //cmake的工...

2019-12-16 14:15:33

阅读数 17

评论数 0

原创 初识c++(37)基于对象的编程思想

基于对象的编程思想 在c++中面向对象的编程思想是基于c++中的各种虚机制来完成的,这里就不详细展开啦。而基于对象的编程思想则是基于std::function和std::bind两个函数来实现的。 std::function和std::bind http://www.cplusplus.co...

2019-12-11 10:23:50

阅读数 16

评论数 0

原创 TCP/IP详解(4)之IP协议之抓包测试

1.版本号:占四位,就是IP协议的版本,通信双方的IP协议必须要达到一致,IPv4的版本就是4. 2.首部长度:占四位,因为长度为四比特,所以首部长度的最大值为1111,15,又因为首部长度代表的单位长度为32个字(也就是4个字节),所以首部长度的最小值就是0101,当然,也确实如此,大部分的i...

2019-11-07 15:45:35

阅读数 174

评论数 0

原创 初识c++(36)之模板函数与分离编译模式

分离编译模式 一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程称为分离编译模式。 举个例子: //main.cpp #include <iostream> #include "hello.h...

2019-11-07 10:33:00

阅读数 14

评论数 0

原创 TCP/IP详解(3)之ARP协议

链路层的数据帧在同一网段中传送时,需要知道下一跳的MAC地址。那么怎么知道IP地址对应的MAC地址呢?这就需要ARP协议啦。 原地址的电脑以广播的形式向本网段中发送ARP协议的数据帧,目标电脑接收到后,会返回APR协议的数据帧,告诉原地址电脑,目标电脑的MAC地址。 硬件类型:16位字段,...

2019-11-04 21:43:13

阅读数 47

评论数 0

原创 TCP/IP详解(2)之数据链路层数据帧的格式以及抓包测试

数据链路层的数据帧的传递是依赖于物理地址来传递的,所以这里的目的地址、原地址都指的是物理地址。帧类型指的是数据帧传递遵循的类型。数据指的是网络层传递下来的数据包,帧校验是用来校验数据帧在传递工程中,是否发生问题! 抓包测试的结果如下: ...

2019-10-30 20:02:47

阅读数 238

评论数 0

原创 TCP/IP详解(1)之计算机网络体系结构

这是自己对这一段时间学习计算机网络的总结,主要内容会集中在tcp/ip协议上面。 每一层的数据叫不同的名字,并遵循不同的协议。 第5层应用层(Application 此层数据单位【消息message】)协议和应用:http,ftp,tftp,telnet,dns,smtp 第4层传输层(...

2019-10-25 14:51:31

阅读数 70

评论数 0

原创 用pytorch搭建最简单的BP网络训练mnist手写数字图片数据集实例

最简单的例子: import torch import torch.nn as nn import torch.nn.functional as F import mnist_loader import numpy as np class Net(nn.Module): def _...

2019-10-24 14:59:39

阅读数 41

评论数 0

原创 剑指offer(6)面试题4:二维数组中的查找(第二版44页)

代码: #include<iostream> using namespace std; bool Find(int* test_array, int rows, int columns, int number) { int min_rows = 0;//从右上角开始查找。 ...

2019-10-21 16:02:00

阅读数 11

评论数 0

原创 初识c++(35)之传递二维数组

在传递一维数组的时候,可以简单粗暴的传递指针。但是对于二维数组来说,必须知道数组的第二维的信息,才可以正确的进行索引。以下几种做法可以正确的传递二维数组。 #include <iostream> using namespace std; /*传二维数组*/ //第1种方式:传数...

2019-10-21 10:32:23

阅读数 6

评论数 0

原创 C++多线程(6)之条件变量(std::condition_variable)

条件变量(std::condition_variable) 这是c++11提供的一个类,用于多线程之间的通信。条件变量顾名思义就是根据不同条件而变化的量。 应用场景 这里举一个例子:有一个线程要求必须达到某种状态才能继续执行,否则将卡死在这里。在这种情况下我们有两种方案,第一种方案就是,在这...

2019-10-21 09:22:22

阅读数 16

评论数 0

原创 数据结构与算法C++实现(10)之哈希表

一、概念 散列技术是在记录的存储位置和他的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key)。查找时,根据这个对应的关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。我们把这种对应关系f成为散列函数,又称为哈希(H...

2019-10-16 14:22:17

阅读数 18

评论数 1

原创 剑指offer(5)不修改数组找出重复的数字(第二版41页)

代码: #include<iostream> int countRange(const int* P_array, int len, int start, int end) { int count = 0; for(int i = 0; i < len-1; ++i)...

2019-10-14 21:18:25

阅读数 6

评论数 0

原创 剑指offer笔记(4)面试题3:数组中重复的数字(第二版39页)

代码: #include<iostream> bool Duplicate(int array_teat[], int len, int& result) { if(array_teat == nullptr || len <= 0) //判断参数是否符合条件 ...

2019-10-12 20:38:27

阅读数 8

评论数 0

原创 23种设计方法c++实现(5)单例模式

单例模式: 这是最简单的模式,就是在程序中,对于某个类只允许实例化一个对象。 单例类负责自己的实例化,并提供调用它的接口。 UML结构图 设计要点 构造函数Singleton()设计为private,这样就只能自己负责实例化自己。 定义一个private staticSinglet...

2019-10-11 20:49:36

阅读数 19

评论数 0

原创 剑指offer笔记(3)c++中重载类的赋值符号

这是剑指offer第二版25页的题目: 按照上面的要求写出来的代码是这样的: #include<iostream> #include<cstring> class CMyString { public: CMyString(char* pData = ...

2019-10-10 21:34:26

阅读数 9

评论数 0

原创 剑指offer笔记(2)C++中类的拷贝构造函数的参数不能是值传递

剑指offer第二版第24页: 书上的解释是: 书上解释的没有错,但是这个问题是可以深挖的,上面的代码即便是将A b = a;这一句删除也不能编译通过。如下面的代码是不能编译通过的。 #include<iostream> class A { private: int ...

2019-10-10 10:10:47

阅读数 11

评论数 0

原创 23中设计模式C++实现(4)之状态模式(State Pattern)

简述: 状态模式又叫做有限状态机。适应场景:我们的对象有多种状态,单对象同一时刻只能保持某一种状态,并当内部变量或者内部变量变化时,我们的对象会在这些状态中变换。 UML结构图 Context(上下文):定义一个与 Client 交互的接口。它维护对 ConcreteState 对象的引...

2019-10-08 16:50:49

阅读数 16

评论数 0

原创 c++多线程(5)之unique_lock的使用

unique_lock是一个类模板,下面简单介绍它的使用方式。 如果只用一个参数,unique_lock与lock_gard的使用方法一样: 可以参考我的这篇博客:https://blog.csdn.net/shaochuang1/article/details/100991407 代码: ...

2019-09-24 21:24:54

阅读数 117

评论数 0

原创 数据结构与算法C++实现(9)之双线链表

这个双向列表的首节点的数据其实是空的,这是为了让操作更加简单。 代码: #ifndef _LIST_H #define _LIST_H template<class T> class Node;//声明 template<class T> class _iterat...

2019-09-24 10:52:34

阅读数 29

评论数 0

原创 初识c++(34)之i++(前加加)与++i(后加加)的重载

对于整数的i++、++i之间的区别就不赘述啦!有时候我们需要重载++,比如说自己写的迭代器,让我们的迭代器重载的++和整数的++达到同样的效果。 形式: operator++ ();//前加加 operator++ (int);//后加加 注;这里的int,没有什么特别的意识,只是为了...

2019-09-23 16:30:26

阅读数 48

评论数 0

原创 C++多线程(4)之死锁以及解决方法

什么叫作死锁: 线程1需要先锁锁A,再锁锁B,才可以执行相应的保护代码。线程2需要先锁锁B,再锁锁A,才可以运行相应的保护代码。如果出现这种情况:线程1锁住了锁A,而线程2锁住了锁B,这个时候两个程序都在等待对方解锁。这就出现了死锁现象。 代码: #include <iostrea...

2019-09-18 21:20:49

阅读数 158

评论数 0

原创 c++多线程(3)之互斥量(mutex)、锁(lock,unlock,lock_guard)的应用

多线程中,多个线程对共享的数据进行访问,应该是最常见的应用。 如果多个线程都只是对共享数据进行读操作,还不会有问题,但是如果有的线程读数据,有的线程写数据,这时候就会出现问题。比如A线程写数据,但是写的这个过程进行到一半,B线程就去读,这个时候程序就会崩溃。这个时候就需要互斥量的出场啦! mu...

2019-09-18 20:40:16

阅读数 799

评论数 1

原创 初识c++(34)之大括号{}与变量的作用域

c++支持在程序的任何地方定义变量,那么变量的作用域就极为重要,这些作用域是用大括号{}来划分的。 例子: #include<iostream> using namespace std; class A { public: A(){cout << "...

2019-09-18 17:00:55

阅读数 135

评论数 0

原创 Ubuntu16.04系统查看已安装的python版本并修改默认指向的版本

Ubuntu16.04系统中一般是有两种python版本的,分别是python2和python3 查看python2的版本 python2 --version 查看python3的版本 python3 --version 查看系统默认指向的版本 python --versio...

2019-09-13 21:01:52

阅读数 380

评论数 0

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