自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 ArchLinux更新遇到错误

问题: 错误:无法提交处理 (有冲突的文件) libbloom: 文件系统中已存在 /usr/lib/libbloom.so.1 发生错误,没有软件包被更新。 Error installing repo packages解决: sudo pacman -Syu --ig...

2019-07-30 14:11:55 2740

原创 C++ 链接时提示类的静态变量未定义,“undefined reference to”错误

今天在工程中写了一个单例,但是调用时,总是报静态变量未定义的错误。// A.hclass FWindowsLoader : public FPhysicalLoader{private: FWindowsLoader(){} static FWindowsLoader* singleFWindowsLoader;public: static FWindowsL...

2019-07-09 14:27:22 6594 2

原创 Head First 设计模式详解之五:单例模式

单例模式确保一个类只有一个实例,并提供一个全局的访问点。单例模式用于全局只需要一个对象的时候,例如线程池,缓存,对话框,注册表等等。单例模式的实现要实现一个单例模式很容易,只需要将构造函数设置为private就可以阻止类的实例化。然后我们创建一个接口,所有对单例模式对象的获取都要通过唯一的获取接口。class Singleton{private: Singleton...

2019-06-28 14:28:51 269

原创 Head First 设计模式详解之四:工厂模式

工厂方法模式定义一个创建对象的接口,但是由子类决定实例化的类是哪一个。工厂方法让类的实例化推迟到子类。也就是说,我们从基类Base中派生出对象A和B,并且定义Factory,派生出FactoryA和FaceoryB,分别用来生成对象A和B的实例,FactoryA和FactoryB就仿佛是一个工厂,标准地使A和B实例化。使用者将不用关心对象创建,实现使用者与具体类之间的解耦。举个例子...

2019-06-27 21:30:45 166

原创 Head First 设计模式详解之三:装饰者模式

什么是装饰者模式装饰者模式动态地将责任附加到对象上。当需要扩展时,装饰者能提供比继承能有弹性的替代方案。当我们需要动态地添加一些功能时,可以使用装饰者模式。举个例子装饰者模式通过创建一个Component基类,然后让装饰者和被装饰者都继承这个基类。并在装饰者只中声明一哥被装饰者变量,从而识别要装饰的对象,并在自己的方法中,对被装饰者的方法进行功能添加。现在我们有许多种咖啡,需要...

2019-06-26 21:48:27 165

原创 Head First 设计模式详解之二:观察者模式

什么是观察者模式对象之间存在一对多的关系,当一个对象状态发生改变时,会通知其他依赖的对象,并使他们自动更新。举个例子我们有一个气象站,并拥有多个种类展示板。当气象站检测到的气象数据发生改变时,展示板也进行相应的改变。我们可以维护一个动态数组,将所有的依赖对象放到里面,状态更新函数update由依赖的类实现。当我们状态发生改变时,只要一一调用数组中的对象的update函数。为此,被依...

2019-06-25 21:40:58 130

原创 Head First 设计模式详解之一:策略模式

本文为Head First设计模式笔记。什么是策略模式策略模式是将应用中实现方法多变的算法独立出来,封装为算法族,通过组合或者其他方式,让算法的调用切换独立于算法的调用者。举个例子我们要设计一个duck鸭子类。我们首先想到设计一个duck基类,然后派生出各种各样的鸭子。class Duck{ virtual void display(); virtual ...

2019-06-25 15:29:47 189

原创 ArchLinux图形界面安装与美化:i3+polybar

arch只提供了tty,我们需要自己配置一个漂亮的桌面。你可以选择继承好的GNOME、Deepin等桌面。但是他们都包含了许多你可能并不能用到的工具和插件。i3wm是一个窗口管理器,它提供了最基础的窗口管理功能。你可以根据自己的需要进行配置,把系统运行的每一个程序都掌握在自己手里。效果图如下:需要安装:i3wm:窗口管理器feh:设置桌面compton:窗口透明化polyb...

2019-05-19 11:43:41 37838

原创 Archlinux安装过程指南

ArchLinux十分精简,并且具有强大的滚动更新。最近安装了下arch,记录下过程,为以后的安装提供参考。1、制作启动盘1.1、下载arch镜像文件到https://www.archlinux.org/download/页面,寻找中国镜像源下载archlinux-**-x86_64.ios镜像文件2.2、制作U盘启动盘软碟通UltraISO制作的启动盘无法启动,读取时找不到相...

2019-05-10 11:51:42 8388

原创 解决VirtualBox共享粘贴板功能无效问题

1、开启共享粘贴板和拖放功能首先我们要开启Virtual Box的共享剪切板功能。在控制 -> 设置 -> 常规 -> 高级中,勾选共享粘贴板和拖放功能。2、开启共享粘贴板后仍无法共享解决办法我的虚拟机在勾选后仍然没有办法启用共享粘贴板。下面介绍解决方法。2.1、安装virtualBox增强功能点击 设备 -> 安装增强功能此时在你的虚拟机...

2019-03-30 18:26:14 28256 10

原创 后台开发面试整理之计算机网络

Q:三次握手和四次握手的状态变化Q:udp和tcp的最大长度udp中用2个字节来记录报文程度大小,即65535个字节(64k)。但是由于ipv4报文允许的报文长定为65535个字节,所以单片能发送的最大长度为65535-20(ip首部)-8(upd首部)=65507字节。在实际应用中,用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20(ip首部)-8(u...

2019-03-24 15:31:27 392

原创 后台开发面试整理之C++

Q:字节对齐对于一些平台,特定的数据类型只能从特定的地址进行读取,随意防止将导致错误。而更一般的情况是,如果不按照规定存放数据,将会造成读写效率上的损耗。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率...

2019-03-24 14:26:19 153

转载 后台开发面试整理之数据库常见面试题

转载自:https://zhuanlan.zhihu.com/p/23713529(一)什么是存储过程?有哪些优缺点?存储过程是一些预编译的SQL语句。更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。...

2019-03-24 14:21:57 1374

原创 Linux下打开word等office文件(openoffice安装)

office并没有Linux版本。 但是,linux平台下也提供了许多可以打开word等文件的软件。当初尝试使用了国产的永中office。其的确提供了office基本所有的常用功能,但是他会自动替换系统中的字体,使得原来本来能正常显示的中文反而不能显示。也许是我的设置方式不对,修改字体顺序无果后,只能忍痛卸载。今天介绍名为OpenOffice的一款软件。OpenOffice也是现在linu...

2019-03-21 14:49:05 21244 3

原创 CPU实现原子操作的方法

在学习并发编程时,我们知道,多条指令不被分割操作被成为原子操作。但是,对于CPU是如何保证原子性的呢。1、对于单核CPU对于单核cpu,所有的事件都是串行,执行完第一才会去执行第二个。所以,单核CPU实现原子操作比较简单。在单核CPU中,每个指令都保证是原子的,即中断只会在指令之间发生。Intel x86指令集支持内存操作数的inc操作,将多条指令的操作在一条指令内完成。因为进程的上下...

2019-03-14 22:39:18 2389 1

原创 linux系统编程(五):目录操作(opendir、readdir、closedir、stat)

1、ls的作用ls命令主要用与输出目录相关的信息。包括当前目录包含的文件,文件的模式,所属,大小等等。2、相关系统调用2.1、打开一个目录opendir opendir 目标 根据目录名打开目录 头文件 #include <sys/types.h> #include <dirent.h> 函数原型 DIR *ope...

2019-03-13 22:34:26 1553

原创 虚函数的工作原理与类的大小

1、虚函数的作用虚函数通过动态联编技术,使程序运行时选择正确的虚方法。使用虚函数,会根据对象的类型来调用函数,而不是根据指针类型。#include<iostream>using namespace std;class A{public: A(){} virtual void show(){ cout << "this is A show" &lt...

2019-03-12 14:23:35 363

原创 linux修改键位:ctrl与caps调换

ctrl比caps的使用频率更高,但是ctrl的位置却对小拇指并不友好。有时使用gnome-tweak-tool设置键位并没有生效。下面介绍两个简单的方法修改键位。1、使用xmodmap修改键位我们可以使用包管理器轻松安装xmodmap。之后我们需要编写键位的配置文件。remove Lock = Caps_Lockremove Control = Control_Lkeysym ...

2019-03-10 10:18:35 3458

原创 linux系统编程(四):修改文件读取指针(lseek)

1、用户注销过程用户注销过程总共包括4步:1、打开utmp文件2、在文件中找到你所在终端的登录记录3、对当前记录做修改4、关闭文件但是,对于write或者read系统调用,都只能顺序读取,或者顺序写入,没有办法读出个一个数据,然后再回头修改它。这时,我们需要使用lseek系统调用来改变当前打开文件的指针位置。指针是与文件描述符相关联的,而不是文件关联,所以如果同一个文件...

2019-03-08 17:19:39 1382

原创 linux系统编程(三):使用缓冲提高I/O效率

1、频繁的系统调用将降低效率用户进程运行在用户控件,而磁盘只能被内核直接访问。当执行系统调用时,需要在内核中执行代码。系统调用的开销不仅仅是因为数据的传输。当运行内核代码时,CPU需要切换到超级用户模式,需要建立额外的堆栈和内存环境,执行完系统调用时,CPU要切换回用户模式,把堆栈和内存环境还原为原来的用户模式运行状态。这种频繁的用户态和内核态切换将消耗更多的时间。为了提高I/O的效率,我...

2019-03-08 16:09:23 370

原创 linux系统编程(二):cp命令编写(creat、write)

1、cp的作用cp命令将一个文件复制到另外一个文件。如果target文件不存在,cp则会创建,如果存在则会复写。2、需要使用的系统调用2.1 创建/重写文件creat:creat告诉内核创建一个名为filename的文件,如果文件不存在,就创建它,如果存在,就清空内容,把长度设为0。 creat 目标 创建/重写一个文件 头文件 #include&l...

2019-03-08 11:38:14 976

原创 linux系统编程(一):who命令编写(open、read、close)

1、who命令的作用通过在terminal调用who命令,我们可以看到现在登录在linux系统的用户。用户登录信息的数据结构定义在/usr/include/utmp.h。wall pts/4 2019-03-07 09:09 (10.165.33.169)shen pts/16 2019-03-05 10:04 (10.165.39.163)li pts...

2019-03-08 09:35:15 864

原创 C++并发编程(八):原子类型与数据竞争

非原子类型C/C++中所有的操作默认为非原子操作。非原子操作,并不保证操作的完整性。当一个操作由2个以上的指令完成时,操作可能只执行了一个指令,变量就被另外一个线程抢占。当多个线程同时读写同一个变量时,就会发生数据竞争。uint64_t i = 0;void foo(){ i = 1;}上述简单的赋值语句,通过一个32位的系统编译,这个操作就需要分别负责高32位和低...

2019-03-04 11:17:05 514

原创 C++并发编程(七):同步操作与强制排序

同步发生与先行发生“同步发生”关系是指:只能在原子类型之间进行的操作。例如对一个数据结构进行操作(对互 斥量上锁),如果数据结构包含有原子类型,并且操作内部执行了一定的原子操作,那么这些操作就是同步发生关系。“先行发生”关系是一个程序中,它指定了某个操作去影响另一个操作。对于单线程来说,如果源码中操作A发生在操作B之前,那么A就先行与B发生。控制线程顺序假设你有两个线程,一个向数据...

2019-03-03 22:37:42 516

原创 C++并发编程(六):内存顺序

原子操作的内存顺行有六个内存顺序选项可应用于对原子类型的操作:memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, 以及memory_order_seq_cst。除非你为特定的操作指定一个顺序选项,否则内存顺序选项对于所有原子类型...

2019-03-03 21:11:35 2334 3

原创 C++并发编程(五):内存模型与原子类型

对象与内存位置1、内存模型C++内存模型可以被看作是C++程序和计算机系统(包括编译器,多核CPU等可能对程序进行乱序优化的软硬件)之间的契约,它规定了多个线程访问同一个内存地址时的语义,以及某个线程对内存地址的更新何时能被其它线程看见。2、对象与内存位置在一个C++程序中的所有数据都是由对象(objects)构成。像int或float这样的对象就是简单基本类型;当然,也有用户定义...

2019-03-03 15:18:37 362

原创 Linux后台运行命令

&对于一些耗费时间的工作或者命令,我们在命令后面接上 &,使其在终端的后台运行。make >& make.log &上述命令,在后台运行编译指令,并将编译的日志重定向到 make.log 文件中。注意: & 可以使命令后台运行,但是当我们关闭控制台时,进程也会随之杀死。如果希望关闭控制台后,进程依旧运行,需要使用nohup。no...

2019-03-02 14:28:53 2117

原创 C++并发编程(四):同步并发操作

使用条件变量等待线程c++提供了std::condition_variable和std::condition_variable_any来实现线程之间的条件等待,它们声明在<condition_variable>头文件。condition_variable必须和一个mutex互斥量来协同工作,condition_variable_any则可以任何互斥量一起工作,更加通用,但是开销和体...

2019-02-28 21:42:26 475

原创 c++报terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1错误

在线程编程时,编译器报terminate called after throwing an instance of 'std::system_error'terminate called recursively  what():  Unknown error -1Aborted (core dumped)解决方法:在链接时,加上 -pthread选项。g++ -std=c++11 -p...

2019-02-26 17:29:02 14192

原创 C++并发编程(三):线程间共享数据

避免恶性条件竞争双向链表具有前后两个链,当一个线程修改一个双向链表的前链还未来及修改后链时,另一个线程进行了数据访问,此时就会发生恶性条件竞争。多线程编程中,我们总会遇到多个线程对一个数据块进行修改,所以需要避免恶性条件竞争。避免恶性条件竞争有三个主要方法。1、对数据块进行加锁等数据保护机制。同一时间,只有一个线程可对数据进行修改操作。2、实现无锁化编程。对数据结构进行无锁化设计。...

2019-02-26 11:26:59 939

原创 C++并发编程(二):线程管理

启动线程thread类的构造函数接收一个可调用的类型。可调用的类型,除了函数,还可以是函数对象和lamda表达式。class foo{public: void operator() (){ for(int i = 0 ; i < 5; i++) std::cout << "foo concurrent \n"; ...

2019-02-22 21:44:23 290

原创 C++并发编程(一):并发与并行,一个简单的多线程例子

并发与并行并发:多个任务可以同时存在。程序在逻辑上可以实现多个任务同时存在,那么这个程序就是并发程序。并发程序在物理实现上既可以是并行,也可以是串行。串行:单个处理器通过“任务切换”的方式,在一秒之内进行多次任务切换,给人一种任务并发的错觉。同一时间只有一个任务得到处理。并行:多个任务在多个处理器中同时运行。多个任务在同一时间一起得到处理。多进程并发与多线程并发多进程并发:将应...

2019-02-22 14:34:18 4755

原创 C++可变参数模板

使用可变参数模板可以生成可变个数参数的模板函数。模板参数包和函数参数包c++提供省略号来声明模板参数包的标识符。用“...”声明的标识符,将可以与多个类型匹配。用法如下:template<typename... Args>void foo(Args... args){}foo(2, 4, "c++", 'c', std::string("java"));Args...

2019-02-19 19:43:45 1063

原创 右值引用和移动语义

右值引用和左值引用在c++当中,所有的变量和表达式都被分为左值和右值。所谓的左值,就是可以被寻址的非临时变量。右值就是无法被寻址的临时变量。左值引用用’&‘符号表示,右值引用用’&&‘符号表示。// 左值引用int n;int *np = new int;const int cn = 100;int & nr = n;int & npr ...

2019-02-19 16:11:13 343

原创 虚基类和多继承

我们声明一个DancerSinger类,多继承于Dancer和Singer类。Dancer和Singer类继承与People类。#include <string>class People{private: std::string name; int age;public: People(); virtual ~People(); vo...

2019-02-18 10:25:11 366 2

原创 C++成员初始化列表

类的成员变量一般在构造函数调用之前就被创建,当我们的类中有常量,或者引用变量时,我们无法在构造函数中对常量进行赋值。class Queue{private: int* front; int* rear; const int size; int & foo;public: Queue(int, int&); ~Queue();...

2019-02-15 11:34:39 282

原创 shell命令执行顺序控制(&&、||、()、{}用法)

shell脚本中,我们希望一些命令能按顺序执行,且根据前面命令的执行结果来后面的命令。我们可以用&&、||等符号完成上述功能。&&符号作用&&符号的使用形式:     命令1 && 命令2& &左边的命令(命令1)返回真(即返回0,成功被执行) 后,& &右边的命令(命令 2)才能够被执行。...

2019-02-15 09:47:56 5917

原创 复制构造函数和赋值运算符

进行c++类设计时,如果不对复制构造函数和赋值运算符进行重写的话,编译器会默认调用默认函数。默认的复制构造函数和赋值运算符会造成许多问题。先看下面一段代码。#include <iostream>#include <cstring>class My_string{private: char* str; int len; static int...

2019-02-14 17:36:48 214

原创 Shell字符串通配符

Shell提供了一套完整的字符串匹配规则。我们在使用find,ps等等命令或者编写脚本时,经常会用到字符串的模糊匹配功能。常用的特殊字符:* 匹配文件名中的任何字符串,包括空字符串。? 匹配文件名中的任何单个字符。 [...] 匹配[ ]中所包含的任何字符。 [!...] 匹配[ ]中非感叹号!之后的字符。使用*匹配所有字符串*号可以放在字符串中可以充当任何字符串来用作...

2019-02-13 16:19:33 3137

原创 make命令参数

转自http://wiki.ubuntu.org.cnmake命令的参数意义下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文档。“-b”“-m”这两个参数的作用是忽略和其它版本make的兼容性。“-B”“--always-make”认为所有的目标都需要更新(重编译)。“-C &lt...

2019-02-12 11:44:37 2083

空空如也

空空如也

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

TA关注的人

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