自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 资源 (4)
  • 收藏
  • 关注

原创 根据显著性水平和自由度计算t值 避免查表python代码

函数参数给出显著性水平和自由度,函数返回t分布的t值。

2024-01-20 17:28:20 330

原创 Linux types.h头文件min宏

#define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })       typeof(x) _x = (x); typeof(y) _y = (y);定义一个和 x 相同类型的变量 _x...

2018-12-21 15:30:59 892

原创 Linux多线程之读写锁

概述一般大家对读写锁应该有一个认知,当读数据比修改数据频繁,我们可以采用读写锁。读写锁的分配规则如下:只要没有线程持有某个给定的读写锁用于写时,那么任意数目的线程可以持有该读写锁用于读;仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于读。获取与释放读写锁     读写锁的类型是pthread_rwlock_t,如果这个类型的某个变量是静态分配的,那么可以通过PTHREAD_RWL...

2018-03-28 15:11:04 2595 1

原创 C++11 lamda表达式

lamda表达式可以被认为是一个匿名的函数,之前不明白为什么C++11中会加入这个特性?匿名的函数能带来什么好处?有名的函数只不过增加了一些函数调用开销而已,无伤大雅。下面开始走进lamda函数的世界。基本的Lamda函数int main(int argc, char** argv){ auto addfun = [](int _a, int _b)->int { return _...

2018-03-23 16:32:34 517

原创 C++11 bind function

C++11标准中的std::bind和std::function是从boost中移植过来的。实践证明,还是相当好用的,同时它们可以和lamda表达式一起用。下面我们想想这样一个问题,比如我有一个类,这个类里面有一个求加法的成员函数,但是我不想在类里面实现,想交由外部实现,那么该采取什么样的策略呢 ?此时,我们通常会想到用函数指针。看下面程序。int addGlobalFun(int _a, int...

2018-03-23 15:13:29 482

原创 typeid 判断对象类型是否一致

在编写程序中,有时候需要判断两个对象是不是同一个类型,就需要用到typeid,通常有些人喜欢用type( obj ).name()去进行字符串的比较,这种比较方式的开销是比较大的。在此,尽量使用hash_code()去进行比较,如下所示。#include <iostream># include <typeinfo>using namespace std; class...

2018-03-23 14:25:54 1616

原创 C++11 NULL与nullptr

C++11增加了nullptr空指针,以前我们常用NULL代表空指针,但是会存在问题,大家都知道NULL其实是一个宏定义,大多数是被定义成0。通过以下代码可以看出NULL和nullptr的区别。struct Work{ void DoWork(int obj) { cout << "DoWork 1" << endl; } void DoWork(int * ...

2018-03-23 13:54:42 309

原创 Valgrind工具使用

Valgrind附带了一组工具,例如著名的memcheck工具。它执行某种调试、代码分析或类似的任务,帮助您改进程序。Valgrind体系结构是模块化的,因此可以轻松地创建新工具,而不影响现有结构。一系列有名的工具如下所示:1.Memcheck是一个内存错误探测器,它帮助你的C C++程序更加正确,性能更加出色;2.Cachegrind是高速缓存和分支预测分析器。它帮助你使程序运行得更快;3.Ca...

2018-03-20 11:02:25 252

原创 Linux多线程之条件变量

上一节中,Linux多线程之互斥锁最后遗留了一个问题,consumewait函数会一直轮询检查生产者是否生产好了条目,这样很浪费CPU的时间,因此,需要有另外一种类型的同步,它允许一个线程(或进程)睡眠到发生某个事件为止。互斥锁用于上锁,条件变量则用于等待。这两种不同类型的同步都是需要的。条件变量是类型为pthread_cond_t的变量,以下两个函数使用了这些#include <pthre...

2018-03-19 15:37:24 3573 3

原创 Linux多线程之互斥锁

互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程在执行其中的代码(假设互斥锁由多个线程共享),或任何时刻只有一个进程在执行其中的代码(假设互斥锁由多个进程共享)。既然任何时刻只有线程能够锁住一个给定的互斥锁,于是这样的代码保证任何时刻只有一个线程在执行其临界区中的指令。 在Linux中,互斥锁被声明为具有pthread_mutex_t数据类型的变量。如果...

2018-03-19 14:52:45 653

原创 C++11新特性之智能指针

本文章参考https://www.cnblogs.com/feng-sc/p/5710724.html#title33。因为其对智能指针介绍的比较详细,在自己的工作中,智能指针用的少,都是new delete用的多,实际开发中,不少情况下会出现内存泄漏的问题,都是因为只有new 没有delete导致的。智能指针为我们解决了资源管理的问题,让我们不再担心资源泄漏的问题。但是智能指针难道就不会存在资源泄

2018-03-18 22:25:01 202

原创 c++11新特性之条件变量

std::condition_variable 是为了解决死锁而生的。当互斥操作不够用而引入的。比如,线程可能需要等待某个条件为真才能继续执行,而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。所以,condition_variable实例被创建出现主要就是用于唤醒等待线程从而避免死锁。std::condition_variable的 notify_one()用于

2018-03-18 21:35:29 1195

原创 c++新特性之std::atomic

std::atomic为C++11封装的原子数据类型, 支持多种类型数据的原子操作,以下是atomic支持的数据类型,摘自http://www.cplusplus.com/reference/atomic/。 #include <atomic>#include <thread>#include <list>std::atomic_int g_iCount = 100;void threadf

2018-03-18 20:58:39 18205 6

原创 c++11新特性之auto

在早期版本中,auto关键字用来声明具有自动存储器的局部变量,auto关键字很少被使用,除了静态变量之外,其它的变量默认是auto的。因此,在c++11中,删除了原有的功能,并对其重新设计,增加了auto的类型推导功能。template <class T1, class T2>double Add( T1 a, T2 b){ auto ret = a + b; return re

2018-03-18 16:25:50 503

原创 设计模式之访问者模式

访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变类的前提下定义作用于这些元素的操作。 访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。 UML图如下: 代码如下:class Action{public: Action() {}...

2018-03-11 23:47:02 125

原创 设计模式之享元模式

享元模式运用共享技术有效地支持大量细粒度的对象。 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时应该考虑使用。对象的大多数状态可以是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时也可以考虑用享元模式。 享元模式UML图如下: 代码如下://网站用户class User{private: std::stri...

2018-03-11 22:12:01 224

原创 设计模式之中介者模式

中介者模式用一个中介对象封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可独立改变它们之间的交互。 如果具体中介者维护的具体的对象繁多时,维护可能比较麻烦。 代码如下:class Colleague{protected: Mediator *m_pMediator;public: Colleague( Mediator* __m )

2018-03-10 11:27:15 153

原创 设计模式之职责链模式

职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 UML图如下所示: demo代码如下。class Request{private: int m_iType; string m_strContent ; int m_iNumber ;public:

2018-03-10 09:46:01 118

原创 设计模式之命令模式

命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 命令模式的UML图如下所示: 代码如下:class Barbecuer{public: Barbecuer() {} ~Barbecuer() {} void BakeMutton() { printf("Barbecu

2018-03-07 23:00:43 153

原创 设计模式之桥接模式

桥接模式其实是合成/聚合规则的一种体现,尽量使用合成/聚合规则,不要使用类继承。聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期是一样的。 代码如下:#ifndef __HANDSET__BRAND__H__#define __HANDSET__BRAND__H__#include

2018-03-07 21:45:57 141

原创 设计模式之单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式非常简单,在开发中经常遇到,比如读写配置文件的类等。 代码如下://单例类class Singleton{private: static Singleton* m_pInstance; Singleton() {} ~Singleton() {}public: static Sin

2018-03-07 20:42:27 87

原创 设计模式之组合模式

组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 下面是组合模式的UML图: 代码如下:class Company{protected: std::string m_strName;public: Company(const std::string& __n) { m_strNam

2018-03-06 22:30:54 137

原创 设计模式之备忘录模式

备忘录模式是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分。备忘录模式最大的作用就是当角色的状态改变时,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。 下面是UML图: Origi

2018-03-05 21:19:57 125

原创 Design Pattern之适配器模式

适配器模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在使用一个已经存在的类时,如果它的接口,也就是方法和你的要求不同时,就应该考虑用适配器模式。 下面是适配器的结构图: 代码如下:class Player{protected: string m_strName;public: Player(s

2018-03-04 21:27:07 140

原创 Design Pattern之状态模式

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式对于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列当中,可以把复杂的判断逻辑简化。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。 下面是状态模式的结构图: 下面是代码:class Work;cl

2018-02-27 23:01:06 138

原创 Design Pattern之观察者模式

观察者模式又叫发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 下面是观察者模式的结构图: Subject类把所有对观察者对象的引用保存在一个聚集里,,每个主题都可以有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。Observer类抽象观察者,为所有的

2018-02-25 21:01:16 140

原创 Design Pattern之建造者模式

如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示意图时,我们需要建造者模式(Builder)。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到它们,而具体的细节就不需知道了。 建造者模式(Builder),将一个复杂对象的构建与

2018-02-19 20:49:47 104

原创 Design Pattern之外观模式

外观模式,为了系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观,这样可以为复杂的子系统提供一个简单的接口,使得耦合度大大降低。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时

2018-02-19 19:40:14 135

原创 Design Pattern之模板方法模式

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 AbstractClass实现了一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。 ConcreteClass实现PrimitiveOperation以完成算法中与特定子类相关的步骤。每一个Abs

2018-02-19 11:43:32 137

原创 Design Pattern之原型模式

原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。在C++里,可通过拷贝构造函数实现原型模式,或者实现赋值运算符也能达到相同的目的,下面是原型模式的UML图。 代码如下:#ifndef __WORKEXPERIENCE_H#define __WORKEXPERIENCE_H#incl

2018-02-18 23:13:23 148

原创 Design Pattern之工厂方法模式

在本文之前,已经介绍过简单工厂模式,简单工厂模式只有一个工厂,该工厂负责产生所有的运算类,如果增加一个运算类,不仅需要修改工厂类,还需要修改客户端类,这违反了设计模式所提倡的开放-封闭原则。本文所说的工厂方法模式就是在之前的简单工厂模式前提下增加了各种运算方法的工厂类,UML图如下: 相比较简单工厂模式,只增加了运算符的工厂类,下面是代码demo,运算符类这里就不列举,只给出工厂类以及客户端代

2018-02-18 21:12:04 165

原创 Design Pattern之代理模式

本文主要介绍代理模式,顾名思义,代理模式指的是为其他对象提供一种代理以控制对这个对象的访问。 代理模式的应用: 1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在不同地址空空间的事实。; 2、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象; 3、安全代理,用来控制真实对象访问时的权限; 4、智能指引,是指当调用真实的对象时

2018-02-18 20:32:47 162

原创 Design Pattern之装饰模式

装饰模式(Decorator),动态地给一个对象添加额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式是为已有功能动态添加更多功能的一种方式,当系统需要更新的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为。如果在已有的类中添加新的字段、新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊

2018-02-14 19:49:49 159

原创 Design Pattern之策略模式

策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 策略模式就是用来封装算法的,实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性[DPE]。下面将实现一个策略模式是商场的收银系统的demo,参考大话设计模式,利用c++对

2018-02-14 11:42:14 148

原创 Design Pattern之简单工厂模式

简单工厂模式顾名思义,就是专门负责生产的,我们需要什么,就让其生产什么。该模式在开发过程中经常会用到,其好处就是在于设计的类能够达到可维护、可复用、可扩展、灵活性好的目的。 例如,利用C++设计一个加减乘除的小程序,直观的思维直接通过输入判断符号类型(+、-、*、/),然后根据不同的类型,直接算出结果,这样有一个问题,如果以后要修改的时候,需要在同一个文件里找到需要增加判断的地方,容易出错。因此...

2018-02-13 23:04:45 180

原创 DLL延迟加载技术

一个延迟载入的DLL是隐式链接的,系统一开始不会将该DLL载入,只有当我们的的代码试图去引用DLL包含的一个符号时,系统才会实际载入该DLL。延迟载入DLL在下列情况下非常有用。如果应用程序使用了多个DLL,那么它的初始化可能会比较慢,因为加载程序要将所有必须的DLL映射到进程的地址空间中。 如果我们在代码中调用一个新的函数,然后又试图在一个不提供该函数的老版本的操作系统中运行该应用程序,那么加

2018-02-13 11:16:48 660

原创 DLL显式载入

之前在文章中提到 过DLL的隐式链接,现在介绍以下DLL的显式载入。DLL显式载入与隐式链接不同的是,我们不需要包含包含DLL导出函数和变量的头文件,不需要显式指定lib文件,比如以下两行代码就可以去掉了。#include "userdefine.h"#pragma comment(lib,"userdefine.lib")上代码://userdefine.h#ifdef ...

2018-02-12 21:28:12 638

原创 Windows Dll动态库隐式链接

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2018-02-12 16:54:21 288

原创 Windows核心编程--线程池内核对象触发调用函数

如果想注册一个工作项,等待一个内核对象被触发的时候去执行,与之前说过的步骤很相似,首先编写如下原型的函数:VOID CALLBACK KernelObjCallback(PTP_CALLBACK_INSTANCE pInstance,PVOID pvContext,PTP_WAIT pWait,TP_WAIT_RESULT WaitResult );pWait是Crea

2018-02-03 20:54:11 280

原创 Windows核心编程--线程池定时器

Windows提供了可等待的计时器内核对象,它使我们非常容易的得到一个基于时间的通知。创建一个可等待计时器内核对象会浪费系统资源。利用线程池来处理定时任务再合适不过了。PTP_TIMER CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnTimerCallback,PVOID pvContext,PTP_CALLBACK_ENVIRON pcb

2018-02-03 19:46:49 1117

valgrind调试教程

valgrind里有很多工具,常用的有memcheck工具,能够帮助我们检查程序的内存泄漏问题,还有一些变量未初始化的问题等等。

2018-03-20

TCP/IP卷3:TCP事务协议、HTTP、NNTP 带书签高清版

《TCP.IP详解(卷3):TCP事务协议.HTTP.NNTP和UNIX域协议》是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。《TCP.IP详解(卷3):TCP事务协议.HTTPP.NNTP和UNIX域协议》同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员

2018-01-08

TCP/IP卷2:实现

用代码描述了TCP/IP四层模型中各个协议的实现细节,网络编程相关工作需要用到。

2018-01-07

TCP/IP卷一:协议

描述TCP四层模型 链路层 网络层 传输层 及应用层中各个协议怎么协调工作的。

2018-01-07

空空如也

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

TA关注的人

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