- 博客(85)
- 资源 (4)
- 收藏
- 关注
原创 Linux进程间互斥锁 (共享内存实现)
01 原理开辟一块共享内存,使得相关进程均可访问同一块区域,再将互斥锁定义在该区域(即共享内存)上,使得相关进程可以使用该锁。02 进程间的互斥锁和线程间互斥锁的区别函数pthread_mutex_init(互斥锁地址, 属性对象地址)在定义一把线程锁的时候第二个参数通常传为NULL,这样该锁默认只能被统一进程下的线程持有。如果要将其定义为进程之间可以持有的互斥锁,则需要传入属性对象地址。...
2019-07-24 22:58:44 12686 1
原创 Linux线程池的原理及实现
01 为什么需要线程池首要明白两个地方:线程的创建需要内存资源线程的创建和销毁需要时间资源显而易见,由于以上两个原因,不得不寻找一个折衷的方式面对多任务的问题。如果我们只创建一定量的线程,且在一个线程执行完某一任务后,重复利用该线程去处理新的任务而不是直接销毁它,那么通过这两个策略我们就可以“朴素”的解决以上两个问题。线程池的初衷就是想搭建一个有一定数量线程,且可以重复利用这些线程处...
2019-07-18 15:30:14 2859
原创 多元线性回归与梯度下降法原理及公式推导(附Python代码)
引以线性方程为例,设有线性方程:ytrue=θ0+θ1x1+θ2x2…+θnxny_{true} = \theta_0 + \theta_1x_1 + \theta_2x_2…+ \theta_nx_nytrue=θ0+θ1x1+θ2x2…+θnxn如果现在我们手头上已经有了N组数据,其中第iii组数据为[xi,1xi,2xi,3…xi,n][x_{i,1} x_{i,2} ...
2019-04-03 10:26:47 15070 8
原创 Sedgewick增量希尔排序和快速排序 (附C++代码)
01 运行时间比对结果随机数组长度为10000时:快速排序:1452希尔排序:2122随机数组长度为100000时:快速排序:19156希尔排序:2980602 Show me the code// Sedgewick增量希尔排序template <class T>void heelSort(T origin[], const long SIZE){ ...
2020-03-01 17:51:04 1267
原创 opencv与openmv?
01 对opencv的认知有图像处理的项目用matlab来仿真做的话,体验不是很友好,尽管matlab在数据可视化方面做的无可匹敌。但是图像处理中,经常会要调用各种滤波,分割,二值化的函数,在这一点上matlab并未提供比较全面的库函数可以调用,opencv则封装了丰富的图像处理函数,使用其做算法的仿真非常得心应手。02 opencv的不足(个人观点)使用C++配合opencv来做图像算法的...
2019-09-12 14:40:57 24991
原创 C++多线程单例模式
01 原理单例模式即是私有化构造函数,创建时通过类中静态函数获得单一实例的一种特殊类。在多线程下需要加上互斥锁,保证单例模式的创建和析构是原子性的。由于单例模式的特殊性,这里不讨论其析构函数,个人在具体使用的环境中不需要析构单例模式的实例。02 结果创建十个线程来测试。singleton bornPID:: 0x70000c545000 ------ instance address ...
2019-09-05 11:47:44 1215
原创 C++ 堆排序
01 思路以从小到大排列为例。代码用到以下几个模块swap模块完成一个数组中的两个位置的元素交换heapify模块完成将一个子树构建为根节点最大的形式。如果根节点不是最大值,那么交换后将对传入最大位置的序号进行递归。build_heap模块从倒数第二层开始反向依次调用heepify模块,直到0节点。sort模块首先调用build_heap建堆,再从最后一...
2019-08-20 16:31:22 336
原创 C++ 生产者消费者模式的简单实现
01 模式简介生产者消费者模式可以理解为在生产者和消费者之间添加一个缓冲区,生产者只负责向缓冲区添加元素,而消费者只负责从缓冲区提取元素并使用。这么做可以对生产者与消费者进行解耦,这样一来消费者不直接调用生产者,使得生产者的不会因为生产者的具体处理而阻塞,充分利用资源。02 思路介绍代码中的具体元素为Stone类,生产者线程负责向缓冲类Busket中添加具体元素,而消费者线程则在缓冲类中的...
2019-08-20 11:47:03 4462
原创 C++中 atomic和mutex的效率
01 引由于“哪怕是对一个bool型变量的赋值和读取都不保证原子性“,所以在并发环境下,操作可能产生Data Race的变量需要认为的加以保护。常用的措施用互斥量mutex的包裹的临界区。利用atomic方式,赋予其原子性。那么这两种措施效率如何呢?02 比对结果mutex互斥量time: 1.76376e+065000000atomic形式time: 3082...
2019-08-16 10:29:37 2563
原创 Linux共享内存 封装
01 Show me the code#include <sys/shm.h>#include <unistd.h>#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc....
2019-07-25 15:20:25 344
原创 LINUX进程变量隔离 虚拟地址
01 虚拟地址Linux系统中,fork()函数创建的子进程,会忠实的将父进程的内存内容进行拷贝,尽管在fork()函数之前定义的变量在各自进程块中的虚拟地址相同,但是不同进程对其的操作是相互隔离的,而不管是fork()之前的全局变量、静态变量还是局部变量,都是如此。如果想使得两个进程操作同一块物理地址,可以使用共享内存的方式,也可以用内存映射(MMP)的方式。02 Show me the ...
2019-07-24 22:33:57 620
原创 Linux内核驱动“Hello World”
01 驱动组成的三大部分一个内核驱动主要分为三大部分:module_init()——入口编写初始化函数并将函数名传入入口函数初始化函数的格式为int __init func_name(void)即返回值为int型,参数类型为void,函数名前的__init表示将其加载到init段。module_exit()——出口编写驱动销毁函数并将函数名传入出口函数,释放资源。...
2019-07-19 21:09:56 296
原创 C++桥模式
01 桥模式的用途若一个类具有两种属性:属性A和属性B。其中A属性有三种B属性有四种。那么实际需要编写的类的个数为3*4 = 12如果我们把具体的类抽象成一种需要装载两种属性的模具,那么需要编写的代码就大大减少。02 构建方法以两种属性为例构建属性A的抽象基类为不同的属性A构建不同的具体类作为基类的派生类,重写基类的方法。构建属性B的抽象类为不同的属性B构建不同的具体类作为基类的派...
2019-06-24 16:48:56 404
原创 C++代理模式
01 使用场景不想让一个类暴露,去填充一个接口需求,这时就构建一个代理类,他封装被代理对象完成实际的调用需要。02 构建方法构建一个只含纯虚方法的基类,被代理类和代理类都是该基类的派生类。被代理类重写基类的方法。代理类内含一个基类类型的指针,实际后续指向堆上的被代理类实例。构造函数接受一个基类类型的指针,实际指向堆上的被代理类实例,并用该指针初始化自身内含的基类指针。重写基类的...
2019-06-24 16:47:52 208
原创 C++工厂模式
01 工厂模式解决了什么问题在实际的项目中,如果只是借助关键字new来创建类的实例,在类的种类越来越多的情况下,很难准确的记住他们的名字,这时候可以将相关类的创建封装在一种"工厂类"中。当要创建相关的类的实例的时候,就借助"工厂实例"中的成员函数完成实例的创建。02 工厂模式的种类简单工厂模式这种模式不利于后期更多"产品类的加入",因为在简单工厂模式下,只存在一个工厂类,而得到不同的产...
2019-06-22 22:21:39 216
原创 C++观察者模式
01 观察者模式做了什么存在过程如下——被观察者更新信息,观察者从被观察者处获取更新的信息,现在我们想省去第二步,即如果观察者订阅了被观察者,那么当被观察者更新信息的时候,被观察者可以自动获取更新。考虑一个具体的模型。对于老师和学生来说,老师是被观察者,学生是观察者,当老师更新一个消息的时候我们想使得订阅该老师的学生能够自动的获取老师本次更新的信息。在代码中借助观察者模式来完成这个操作。0...
2019-06-21 16:50:34 632
原创 C++适配器模式
01 用途两个接口不匹配的类想要交互,直接改接口太繁琐(大工程就体现出来了),就添加第三类(适配器类)来协调两者的关系。形象理解,假设现在有两个忍者——年轻的忍者和年老的忍者,其中年轻的攻击漏洞百出,而年老的则成熟稳健,现在年轻的忍者需要参加考试,所以想打出老年忍者成熟稳健的拳法,适配器就完成了这个转换过程,即用老年忍者来“训练”年轻的忍者。02 分类及实现方法适配器模式分为两类对象适...
2019-06-21 11:40:53 231
原创 C++默认构造函数、拷贝构造函数、拷贝赋值函数
注意前两者会在创建一个类实例的时候被调用,而最后的拷贝赋值函数是对一个已经创建的实力进行=调用的时候被调用。拷贝赋值函数的返回值应该为该类的一个引用,否则无法使用classA = classB = classC。Show me the code#include <iostream>using namespace std;class Base {public:...
2019-05-30 20:28:11 1897
原创 C++生成均匀分布随机数(附C++代码)
生成均匀分布随机数的准备准备随机数生成引擎,这里用到默认引擎——defalut_random_engin my_engine_name创建均匀分布随机数生成器实例——uniform_int_distribution my_object_name(LOW, HIGH)(两边均为闭区间)传入引擎利用生成器生成随机数——object_name(my_engin_name)Show me th...
2019-05-23 11:50:21 7176
原创 C++多线程异步并行——async、future(附C++代码)
先上代码体会#include <iostream>#include <future>#include <chrono>using namespace std;// 定义一个会返回5的函数int fun(char c) { // 循环输出字符 for (int i = 0; i < 20; ++i) { ...
2019-05-21 22:10:01 3081
原创 Mysql 成长之路(六)%与_通配符及使用建议
两种通配符的使用原表mysql> select * from simple_account;+----+-----------+-------+-----+---------+| id | name | sex | age | money |+----+-----------+-------+-----+---------+| 1 | Tom | ...
2019-05-06 11:03:13 216
原创 CSS 成长之路(九)边框及属性
边框及属性定义边框方式border-width border-style border-color三者缺一不可,或者连写为border: [A] [B] [C];缺一不可。A为边框宽度,单位px。B为边框样式实线:solid虚线:dashed更虚的线:dottedC为边框颜色如设置1像素的红色虚线框为:border: 1px solid red;...
2019-05-05 11:27:38 173
原创 CSS 成长之路(八)背景图平铺,背景图位置与背景图滚动
背景图属性设置背景颜色background-color设置背景图background-image: url(IMAGE_PATH);这里路径为相对路径。是否平铺background-repeat平铺(默认):repeat不平铺:no-repeat横铺:repeat-x竖铺:repeat-y背景位置background-position:[A][空...
2019-05-05 11:20:26 849
原创 CSS 成长之路(七)层叠性、继承性与优先级
CSS三大特征性层叠性解决样式处理冲突的能力,如果对在多处定义同一部分,若各处的优先级相同,则按照最后的定义为准。继承性大多跟文字有关的特性如字号和颜色可以被继承,但高度不会被继承。优先级根据样式定义的方式不同,分为不同优先级,如果在多处对同一部分进行定义,则以优先级高的为准,若优先级相同,则按照层叠性。优先级可以叠加,对应位相加但是不进位。优先级从低到高为*方...
2019-05-05 10:44:56 168
原创 CSS 成长之路(五)文本垂直居中与设置背景图
文本垂直居中方法:盒内元素的行高等于盒子的高度即可完成文本的垂直居中。结果如下图:将如下代码复制保存为.html格式的文件,并用浏览器查看结果。注意第23与26行设置两者高度相同。<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <meta ...
2019-04-28 11:23:04 350
原创 CSS 成长之路(四)显示模式与显示模式转换
显示模式块级元素——block如:div一个元素占一整行,可以改变大小行内元素——inline如:span可以多个占一行,不可以改变大小行内块元素——inline-block如:img可以多个占一行,可以改变大小显示模式转换——display转行内元素:display: inline;如div {display: inline;}转块级元素...
2019-04-28 10:55:20 152
原创 CSS 成长之路(三)伪类选择器
伪类选择器用途用来修饰标签<a href= "#">xxx</a>修饰链接内容在未访问link、访问后visited、鼠标悬停时hover和鼠标点下未松开时active的状态。注意,这四个内容的顺序不可以调换,用的最多的未link和hover。类选择器:.类名伪类选择器:a:上述属性Show me the code将代码保存为.html结尾的文件并用浏览器产...
2019-04-26 23:24:12 181
原创 CSS 成长之路(二)后代选择器、子代选择器、交集选择器与并集选择器
后代、子代选择器在HTML中普遍存在标签的嵌套,观察如下HTML5代码。<div> <span>111</span> <ul> <li> <span>222</span> </li> <li> ...
2019-04-26 23:11:22 917
原创 CSS 成长之路(一)颜色、字体属性及文本属性
颜色颜色属性color的值不仅可以用颜色名表示如blue或者red等,还可以#加6位16进制的数字表示。如#123456,其中12两位表示红色的程度,34两位表示绿色的程度,56两位表示蓝色的程度,最终的颜色右三种颜色合成。同一颜色的两位相同的话可以简写,如红色#ff0000可以简写为#f00。纯白#fff,纯黑#000。字体属性字体大小font-size单位:px像素、em相...
2019-04-26 22:43:54 424
原创 HTML5 成长之路 (四)表单、表单域与表单控件
Show me the code将代码保存为.html格式结尾的文件并用浏览器查看结果<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>表单、表单域、表单控件</title> <style> caption {...
2019-04-26 11:14:42 383
原创 HTML5 成长之路 (三)表格、边框及合并单元格
Show me the code将代码复制保存为.html结尾的文件并用浏览器产看结果。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>表格</title></head><body> <h1&...
2019-04-25 22:23:10 1428
原创 HTML5 成长之路 (二)有序、无序、自定义列表
Show me the code保存为.html的文件查看结果<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>无序、有序、自定义列表列表</title></head><body> <h1>...
2019-04-25 21:59:34 284
原创 HTML5 成长之路 (一)HTML基本语法
在Sublime中快速建立HTML5框架的快捷键! + Tabhtml:5 + TabHTML5基本语法请复制并保存为.html结尾的文件并用浏览器打开<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>HTML基本语法<...
2019-04-25 21:42:13 189
原创 Mysql 成长之路(五)利用LIMIT限制输出结果
原数据mysql> select * from simple_account;+----+-----------+-------+-----+---------+| id | name | sex | age | money |+----+-----------+-------+-----+---------+| 1 | Tom | man | ...
2019-04-25 09:05:55 299
原创 Mysql 成长之路(四)使用where按条件查询数据
原始表mysql> select * from simple_account;+----+-----------+-------+-----+---------+| id | name | sex | age | money |+----+-----------+-------+-----+---------+| 1 | Tom | man | ...
2019-04-24 22:00:53 358
原创 Mysql 成长之路(三)表的查询与升序、降序排列结果
查看表原始数据mysql> select * from simple_account;+----+-----------+-------+-----+---------+| id | name | sex | age | money |+----+-----------+-------+-----+---------+| 1 | Tom | man ...
2019-04-24 21:30:46 2571
原创 Mysql 成长之路(二)创建数据库与创建表
启动Mysql命令行开启Mysql服务并登陆Mysql:mysql.server startmysql -uroot -p你的密码新建数据库查看现有数据库并创建名为learn_mysql的数据库:第1行 ——查看现有数据库第12行 ——创建learn_mysql数据库第15行 ——查看是否创建成功mysql> show databases;+------------...
2019-04-24 20:59:40 341
原创 Mysql 成长之路(一)Mac利用Homebrew配置Mysql数据库
配置步骤登陆Homebrew官网安装brew工具。控制台运行brew install mysql。控制台开启mysql服务mysql.server start。控制台以root用户身份登陆数据库mysql -uroot -p。关闭mysql,在mysql命令行键入quit。控制台关闭mysql服务mysql.server stop。...
2019-04-24 09:49:55 392
原创 利用SVD进行图像压缩(附Python代码)
SVD图像压缩步骤对于RGB图像来说,对应三色层,对每一个色层进行SVD分解,得到U,S,VU, S, VU,S,V矩阵,设利用前K大奇异值进行图像压缩,即有:result=∑i=13Ui[:,1:K]∗S[1:K,1:K]∗VT[1:K,:]result = \sum_{i = 1}^{3}U_i[:, 1:K] * S[1:K, 1:K] * V^T[1:K, :]result=i=1∑3...
2019-04-19 15:45:12 9883 13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人