自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言带你入门

C语言基础QWQ本人萌新小白,最近突发奇想打算开始写博客,就从最近刚刚从新温习的c语言开始吧,以后会陆续分享各种学习内容,望各位大佬指点一二。文章目录C语言基础QWQ1 gcc vim编译器gccmake编辑器vim2 基本概念2.1程序思路2.2 算法2.3 程序2.4 进程3 数据类型、运算符、表达式3.1 数据类型3.2 变量与常量3.3 运算符和表达式4 输入输出4.1格式化输入输出...

2020-04-16 21:06:47 1027 5

原创 03 重修C++之并发实战9

【高级线程管理】

2023-08-01 14:12:15 136

原创 03 重修C++之并发实战 8

【设计并发代码】

2023-03-27 22:09:50 491 1

原创 02 数据库语言SQL

定义数据库和表(使用DDL),向表中最佳元组(使用DML)创建数据库(DB)——Create Database创建DB中的Table(定义关系模式)——Create TableDDL通常由DBA来使用,也有经DBA授权后由应用程序员来使用。创建Database:数据库可以看作是一个集中存放若干Table的大型文件,创建语法形式如下:​ create database 数据库名;...

2022-08-31 15:25:42 2420

原创 01 HTTP协议相关

客户端收到响应头的内容后会将Cookie:JSEESIONID=xxx的信息存储起来,Cookie中一般会带有两个字段(domain和path,一般由服务器设置),作用是将来请求那些路径时会携带cookie。跨域受同源策略影响,规定默认情况下,AJAX请求只能发送给同源的URL(同源是指三个相同:协议、域名(IP),端口)。:POST请求时,请求体的编码方式(默认值:application/x-www-urlencoded:用&分隔参数,用=分隔键和值,字符用URL编码方式进行编码)。......

2022-08-30 16:34:29 669

原创 00网络协议

主要目的是防止server端一直等待,浪费资源。如果只需要两次握手,可能回出现客户端发出的第一个连接请求报文段因为网络延迟,在连接释放以后的某个时间才到达server,会导致二次“连接”服务端会空等,客户端不会理会。三次握手,客户端会返回确认,如果没返回确认就知道客户端没有建立连接的要求。...

2022-08-10 17:14:53 603

原创 01 关系模型及其相关内容

用户针对具体的应用环境定义的完整性约束条件。

2022-08-09 11:44:26 794

原创 00 数据库基础概念

数据库(概念)是电子化信息的集合,将信息规范化并使之电子化,形成电子信息“库”,以便利用计算机对这些信息进行快速有效的存储、检索、统计与管理。数据库起源于规范化**“表(Table)”**的处理。Table:以按行按列形式组织及展现的数据。Table中描述了一批相互有关联关系的数据。对表的抽象:理解-区分-命名-表达。表的内容:表名(标题)、表标题(格式)、表内容(值)、行(元组/记录)、列(字段/属性/数据项)。表名+表标题=关系模式,表明+表标题+表内容=表/关系以上面的内容论述,数据库(Databas

2022-08-09 11:42:08 292

原创 03 重修C++之并发实战7

03重修C++之并发实战7上一篇:03 重修C++之并发实战6【设计无锁的并发数据结构】7.1定义和结果使用互斥元、条件变量以及 future 来同步数据的算法和数据结构被称为阻塞(bloking)的算法和数据结构。调用库函数的应用会中断一个线程的执行,直到另一个线程执行一个动作。这种库函数调用被称为阻塞调用,因为直到阻塞被释放时线程才能继续执行下去。通常,操作系统会完全阻塞一个线程(并且将这个线程的时间片分给另一个线程)直到另一个线程执行了适当的动作将其解锁,可以是解锁互斥元、通知条件变量或者使得

2022-04-06 14:50:46 1622

原创 03 重修C++之并发实战6

03 重修C++之并发实战6上一篇:03 重修C++之并发实战5文章目录03 重修C++之并发实战66.1 为并发设计的含义为并发设计数据结构准则6.2 基于锁的并发数据结构使用锁和条件变量得线程安全队列使用细粒度锁和条件变量的线程安全队列6.3 设计更复杂的基于锁的数据结构6.3.1 编写一个使用锁的线程安全查找表设计一个细粒度锁的MAP数据结构6.2.3 编写一个使用锁的线程安全列表【设计基于锁的并发数据结构】6.1 为并发设计的含义在最基本的层面,为并发设计数据结构意味着多个线程可以同时使用

2022-01-03 11:07:59 1058

原创 03 重修C++之并发实战5

03 重修C++之并发实战5上一篇:03 重修C++之并发实战4文章目录03 重修C++之并发实战55.1 内存模型基础5.1.1 对象和内存位置5.1.2 对象、内存位置以及并发5.1.3 修改顺序5.2 C++中的原子操作及类型5.2.1 标准原子类型5.2.2 std::atomic_flag 上的操作5.2.3 基于 `std::atomic` 的操作5.2.4 `std::atomicC++11中的一个重要特性之一就是新的多线程感知内存模型。C++为了提供足够灵活的使用方法,不需要再使用一个比

2021-12-13 17:10:42 965

原创 03 重修C++之并发实战4

03 重修C++之并发实战4.1上一篇:03 重修C++之并发实战3.5-3.8(3end)【同步并发操作】有些时候我们不仅要保护数据,还需要在独立的线程上进行同步操作。例如,一个线程在能够完成其认为u之前可能需要等待另一个线程完成任务。一般来说一个西安城等待特定事件的发生或是一个条件变为true是常见的。虽然通过定期检查“任务完成”的标识或是在共享数据中存储类似的东西也能实现这种功能,但是效果和效率却不够理想。对于这样的需求,C++标准库提供了以**条件变量(condition)和期值(future

2021-11-04 16:19:00 606

原创 03 重修C++之并发实战3.5-3.8(3end)

上一篇:03 重修C++之并发实战3.3-3.403 重修C++之并发实战3.5-3.8(3end)文章目录03 重修C++之并发实战3.5-3.8(3end)3.5 用 std::unique_lock 灵活锁定3.6 在作用域之间转移锁的所有权3.7 锁定在恰当的粒度3.8 用于共享数据保护的替代工具在初始化时保护数据保护很少更新的数据结构递归锁3.5 用 std::unique_lock 灵活锁定通过松弛不变量,std::unique_lock比std::lock_gurad提供了更多的灵活性

2021-11-02 18:51:28 533 2

原创 03 重修C++之并发实战3.3-3.4

上一篇:03 重修C++之并发实战3.1-3.203 重修C++之并发实战3.3-3.4文章目录03 重修C++之并发实战3.3-3.43.3 一个线程安全堆栈的示范定义3.4 死锁:问题和解决方案3.4.1 简单死锁3.4.2 避免死锁的进一步指南1.避免嵌套锁2.在持有锁时避免调用用户提供代码’3.以固定次序获取锁4.使用层次锁5.将这些设计准则扩展到锁之外3.5 用 std::unique_lock 灵活锁定3.3 一个线程安全堆栈的示范定义下面将使用上述的1、3选项实现一个线程安全的堆栈,其

2021-11-01 15:36:38 323

原创 03 重修C++之并发实战3.1-3.2

文章目录03 重修C++之并发实战3.1-3.23.1 线程之间共享数据的问题3.2 竞争条件3.2.1 避免有问题的竞争条件3.2.2 用互斥元保护共享数据3.2.3 发现接口中固有的竞争条件选项1:传入引用选项2:要求不引发异常的拷贝构造函数或移动构造函数选项3:返回指向出栈顶的指针选项4:同时提供选项1以及2或33.3 一个线程安全堆栈的示范定义上一篇:03 重修C++之并发实战1-203 重修C++之并发实战3.1-3.23.1 线程之间共享数据的问题从整体上来看,所有线程之间共享数据的问题

2021-10-29 17:13:55 314 2

原创 03 重修C++之并发实战1-2

03 重修C++之并发实战【持续更新中】文章目录03 重修C++之并发实战1 开始入门你好并发世界2 管理线程2.1 启动线程2.2 等待线程完成2.3 在后台运行线程2.4 传递参数给线程函数2.5 转移线程所有权2.6 在运行时选择线程数量2.7 线程标识3 线程间共享数据1 开始入门让我们开始学习C++的多线程编写,C++!C++!C++!不是C,想看C的盆友请转到哦之前的文章 二、多线程_Linux C ,准确来说在 C++ 中使用 C 的多线程方法写也是没有问题的,而其本质上C++的多线

2021-10-26 14:42:20 295

原创 # 00_1 重修C++之CMake大法好

00_1 重修C++之CMake大法好1 简述本人以前对CMake有一点接触,不是很熟练但是会一些基本的使用,最近由于在“重修C++”学习一些更加偏向工程实践的内容,所以就需要对CMake有一个系统的了解,本次学习的目标在于会用、会写、会改。cmake 是一个支持跨平台的项目构建器,我们可以使用cmake构建、安装项目或直接运行其他响应的构建编译工具。其目的是为了描述如何自动实现从源代码到项目构建再到可执行文件和库的工作流程。要生产带有CMake的构建系统,必须有下面几个部分:源 树:简

2021-10-21 16:05:25 304

原创 02 重修C++之第一个程序

02 重修C++之第一个程序上一节简单说明了环境搭建,现在我们来开始我们的第一个程序HelloWorld。创建一个HelloWorld首先新建一个工程目录 HelloWorld 在目录下新建两个文件夹 build src 。HelloWorld/├── build└── src在src下新建文件HelloWorld.cpp,并添加内容#include <iostream>using namespace std;int main(int argc, const char*

2021-10-16 16:08:03 173

原创 01 重修C++之环境配置

01 重修C++之环境配置操作系统虽然本人之前有一些使用Ubuntu的经验,但是由于想接触服务器后端所以本次决定使用比较偏向服务器的Linux发行版,CentOS8。安装到虚拟机VMware上。安装过程这里不做过多描述,网上有很多教程,下面说一下安装后的一些设置和调整。Terminal快捷键之前使用Ubuntu有一组快捷键 Ctrl + Alt + T 能快速调出Terminal,但是这个功能在CentOS中不是默认支持的,需要手动设置。首先打开图形化界面的 Settings 找到Devices

2021-10-16 16:05:44 259

原创 音视频封装格式、编码格式

音视频封装格式、编码格式概述常见的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件其实只能算是一种封装标准。一个完整的视频文件是由音频和视频2部分组成的。H264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式。例如:将一个Xvid视频编码文件和一个MP3音频编码文件按AVI封装标准封装以后,就得到一个AVI后缀的视频文件,这个就是我们常见的AVI视频文件了。由于很多种视频编码文件、音频编码文件都符合AVI封装要求,则意味着即使是AVI后缀,也可能里面的具体编码格

2021-10-12 20:25:54 625

原创 流媒体传输协议

流媒体传输协议流媒体指的是使音频和视频形成稳定和连续的传输流和回放流的一系列技术、方法和协议的总称,即流媒体技术。通过流媒体技术,服务器能够向客户机发送稳定和连续的多媒体数据流。客户机在接收数据的同时以一个稳定的速率回放,而不用等数据全部下载完之后再进行回放。流媒体协议的作用:流同步、播放控制、质量控制、多端跨平台播放等。直播三要素:低延时、高可用、质量反馈和检测。RTP & RTCP (实时传输协议 & 实时传输控制协议)RTSP (实时流协议)RSVP

2021-10-12 20:21:13 1626

原创 08设计模式—Command、 Visitor、Interpreter

08行为变化 & 领域问题行为变化在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。"行为变化"模式将组件的行为和组件本身进行解耦合,从而支持组件行为的变化,实现两者之间的松耦合。行为一般是指一段代码,所以天然的行为就和对象形成了编译时的紧耦合。Command(命令)在软件构建过程中,"行为请求者"与"行为实现者"通常呈现一种紧耦合。但是在某些场合————比如需要对行为进行记录、撤销、重做、等事物处理,这种无法抵御变化的紧耦合是不合适的。将一个请求封装成一个对象,从而使你可用

2021-09-21 00:31:10 118

原创 07设计模式—Composite、Iterator、Chain of Responsiblity

07数据结构常常有一些组件在内部具有特定的数据结构,如果客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定的数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。Composite(组合)将对象组合成树形结构以表示 “部分-整体” 的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。对于Composite模式,采用树形结构来实现普遍存在的对象容器,从而将"一对多"的关系转化为"一对一"的关系,使得客户代码可

2021-09-13 21:27:44 125

原创 06设计模式—Memento、State

06状态变化在组件的构建中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理,同时又维持高层模块的稳定是一个很重要的问题。"状态变化"模式为这一问题提供了一种解决方案。Memento(备忘录)在软件构建过程中,某些对象的状态在转换过程中,可能由于某些需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,遍会暴露对象的细节实现。备忘录在不破坏封装性的前提下,捕获一个对象内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态

2021-09-08 22:01:25 157

原创 Android NDK 开发

Android NDK 开发Android NDK 简介NDK 全称 Native Development Kit 本地语言(C/C++)开发包。而对应的Android开发中使用的是 Android-SDK,(Software Development Kit)软件开发包(只支持Java语言开发)。我们可以利用 NDK 将 C/C++ 开发的代码编译成 so 库,让 Java 程序调用。Java 使用的是 JNI(Java本地接口) 来调用。NDK 开发优点:利用 NDK 开发的库,不容易被反编译,

2021-09-03 19:36:44 458

原创 05设计模式—Facade、Proxy、Adapter、Mediator

05接口隔离在组件构建过程中,某些接口的直接依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。Facade 外观模式为了降低系统的复杂性。一个常见的设计目标是使用子系统间的通信和相互依赖关系。为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。Facade 更多的是一种设计思想是从架构的层次去看整个系统,没有固定的代码结构。但是它并不是一个集装箱,可以任意地放进

2021-09-03 19:35:37 275

原创 04设计模式—Singleton、Flyweight

04对象性能面向对象很好地解决了"抽象"的问题,但是必不可免地要付出一定的代价。但是某些情况下,面向对象所带来的成本必须谨慎处理。Singleton 单件模式保证一个类仅有一个实例,并提供一个访问它的全局访问点(绕过常规的构造器)。这是类的设计者的责任,而不是使用者的责任。单例模式的设计需要考虑线程安全的问题,如下考虑。Singleton* Singleton::m_instance = nullptr;// 线程非安全版本Singleton* Singleton::getInstance()

2021-08-31 20:24:53 148

原创 Android 学习 11 DAY

Android 学习 11 DAY【服务】服务简介服务(Service)是 Android 中实现程序后台运行的解决方案,它非常合适去执行那些不需要和用户交互而且要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序的进程被杀掉时,所有依赖于该进程的服务也会停止运行。实际上服务并不会自动开启线程,所有代码都是默认运行在主线程当中的。

2021-08-26 18:57:52 340

原创 Android 学习 10 DAY

Android 学习 10 DAY【网络技术】WebView、网络请求、格式解析WebView 的用法Android 支持开发者在应用内部嵌入一个浏览器,可以通过 WebView 控件来实现,新建 WebView 项目。修改 activity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

2021-08-26 18:56:34 127

原创 03设计模式— Factory Method、Abstract Factory、Prototype、Builder

对象创建通过"对象创建"模式绕开 new,避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。Factory Method 工厂方法定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。其中:Product 定义工厂方法所创建的对象接口,简单来说就是我们要创建的目标对象的抽象基类。ConcreteProduct 实现 Product 接口,对应我们要创建的目标对象的

2021-08-26 18:53:42 208

原创 02设计模式— Decorator、Bridge

单一职责 模式Decorator 装饰动机希望给某个对象而不是整个类添加一些功能,能够动态地给一个对象添加一些额外的职责。由于过度地继承来扩展对象的功能,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。动态地给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(能够有效消除重复代码并且减少子类个数)。这样就诞生了 Decorator 模式,我们可以使用组合

2021-08-26 18:50:55 94

原创 01设计模式— Template Method、Strategy、Observer

01组件协作Template Method 模版方法Template Method 模版方法是一种类行为模式,比较官方的说法是:一项任务有稳定的整体操作结构,但是子步骤有很多改变,能够定义一个算法的骨架,而将一些步骤延迟到子类中的模式。通俗点讲,就是定义一个类实现完整的框架流程,但是其中部分具体的细节对外提供接口,由外部实现的方法,具体体现在一个类(C++)中如果有虚函数(Java中使用的是重载)那么这个类就有极大的可能使用了模版方法。这种处理方法,与C语言中的回调函数(函数指针)有些类似,实现的是一

2021-08-24 22:35:24 82

原创 Android 学习 09 DAY

Android 学习 09 DAY【手机多媒体】通知、媒体调用将程序运行到手机上略使用通知通知的基本用法通知的用法比较灵活,既可以在活动里创建,也可以在广播接收器里创建,相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,一般只有当程序进入后台的时候我们才需要使用通知。不过,不论在哪里创建通知,整体的步骤都是相同的,下面我们就来学习一下创建通知的详细步骤。首先需要一个 NotificationManager 来对通知进行管理,可以调用 Context 的 getSystemService

2021-08-22 09:31:04 95

原创 Android 学习 08 DAY

Android 学习 08 DAY【跨程序共享数据】探究内容提供器内容提供器简介内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用内容提供器是 Android 实现跨程序共享数据的标准方式。不同于文件存储和 SharedPreferences 存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏

2021-08-22 09:29:46 147

原创 Android 学习 07 DAY

Android 学习 07 DAY【数据存储全方案】详解持久化技术持久化技术简介数据的持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。持久化技术被广泛应用于各种程序设计的领域当中,而本书中要探讨的自然是 Android 中的数据持久化技术。Android 系统中主要提供了 3 种方式用于简单地实

2021-08-22 09:28:47 96

原创 0 设计模式简介

0 设计模式简介什么是设计模式简单来说,设计模式就是解决不断重复问题的方案。其精髓在于增加代码的复用性。当然这里的复用性是指编译层面的复用性,不是简单的复制粘贴。对于机器而言每当源文件发生"改变",在整体编译的时候就会从新编一发生改变的文件。而设计模式要做的就是减少和避免改变的发生,更多的是扩展。设计模式更多的是注重问题的解决方案,而非具体的实现方法和编程语言。设计模式的核心思想设计模式的核心思想就是用面向对象的设计方式实现松耦合的、结构化的高复用的问题解决方案。要正确的理解"隔离变化"正确处理

2021-08-20 19:37:09 290

原创 Android 学习 06 DAY

Android 学习 06 DAY【主要内容】全局喇叭详解广播机制:为了方便于进行系统级别的消息通知,Android 也引入了一套类似广播消息机制。广播机制简介Android 中的每个应用程序都可以对知己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容。Android 提供了一套完整的 API,允许应用程序自由地发送和接收广播。发送广播的方法广播的方法其实之前稍微提到过,在之前的 Intent 部分。而接收广播的方法需要引入一个新概念——广播接收器(Broadcast Receiver

2021-08-18 22:46:48 131

原创 Android 学习 05 DAY

Android 学习 05 DAY【主要内容】碎片(Fragment)碎片是一种可以嵌入在活动中的UI片段,可以粗略地将碎片理解成一个“迷你活动”。碎片是为了更加充分利用平板电脑的大屏幕而生的,如果把手机界面等比例放大,放在平板上这显然是不合理的,不仅使用起来不方便,而且浪费了大量的屏幕空间。如果使用两个碎片将屏幕按不同比例分割开,分别完成不同的功能,就能很好地解决这个问题。碎片的使用方式新建一个 FragmentTest 项目。碎片的简单用法这里先在一个活动中添加两个碎片,并让这两个碎片平分活

2021-08-18 22:45:28 110

原创 Android 学习 04 DAY

Android 学习 04 DAY【主要内容】简单和常用的控件简介。常用控件的使用方法TextView例:<LinearLaout xmlnx:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="macth_parent" android:layout_height="macth_parent">

2021-08-18 22:43:42 199

原创 Android 学习 03 DAY

Android 学习 03 DAY【主要内容】活动生命周期。活动生命周期返回栈Android 每启动一个新活动,就会覆盖在原活动之上,然后点击Back就会销毁最上面的活动,下面的一个活动就会重新显示出来。Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在站立的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后劲先出的数据结构,在默认情况下,每当启动了一个新的活动时,它就会在返回栈中入栈,并处于栈顶位置,每当销毁一个活动时,处于栈顶的活动就会出栈,这时前一个入

2021-08-12 20:05:27 149

二、线程简析_Linux C 的历程_mysem

二、线程简析_Linux C 的历程 初始化一个资源总量,每有一个任务减一,直至资源耗尽。使用完归还资源。可以用 互斥量 + 信号量 解决。 这里我们用之前同时用200个线程计算30000000~30000200之间的质数程序为例,我们在不改变整个程序的结构的前提下,限制同时存在的线程数量(4个)来保证计算机资源能够合理分配理用。 mysem就是简易的信号量封装程序

2020-09-30

空空如也

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

TA关注的人

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