自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++并发编程实战——07.设计无锁的并发数据结构

用去同步的数据结构与算法被称为阻塞数据结构与算法。程序调用库函数使线程阻塞(block),OS将线程挂起,直至被另一线程解除阻塞(unblock)。当程序不使用这些库函数使线程阻塞和解除阻塞,称为无阻塞结构。但是,无阻塞结构并不是都是无锁的!!!

2023-11-02 23:47:30 256

原创 C++并发编程实战——06.设计基于锁的并发数据结构

或者当多个线程执行不同的操作时,对同一数据结构的并发操作是安全的,而多线程执行同样的操作时,可能会出现问题。本质上互斥量使线程只能**串行化(serialzation)**访问数据,为了实现更高效并发的设计思路:减少保护区域,减少序列化操作,提升并发访问的能力,但修改必须是单线程的,这种结构类似于。这会限制栈的实现方式,线程等待时会浪费宝贵的资源去检查数据,或要求用户编写等待和提示的代码,这使内部锁失去存在的意义,也造成资源的浪费。STL类的迭代器需要持有容器内部引用,意思就是要有锁,脱离原容器的控制。

2023-11-02 23:46:28 145

原创 C++并发编程实战——05.内存模型与原子操作

一个保存操作A(标记为memory_ order_release, memory_order_acq_rel或memory_order_seq_cst)前序依赖一个读取操作B(标记为memory_order_consume),前提是操作B使用了保存的值。保存操作使用memory_order_release,读取操作使用memory_order_consume,这确保了其原子操作加载指向某些数据的指针,所指向的数据是正确同步的,而不对任何其他非依赖的数据施加任何同步要求(常用于指针)。原子变量this值!

2023-11-02 23:45:02 189

原创 C++并发编程实战——04.同步操作

因为锁存器是一个同步对象,所以线程调用cound_down改变计数器的行为是可见的,从而保证对wait的调用和返回在同一个锁存器 上为可见。当线程都抵达栅栏时,会对线程进行阻塞,直到所有线程都达到栅栏处,这时阻塞将会被解除。:在系统中有很多独立的(运行在一个独立的线程上)参与者,这些参与者会互相发送信息,去执行手头上的任务,并且不会共享状态,除非是通过信息直接传入的。方法一:当一个线程等待另一个线程完成时,可以持续的检查共享数据标志(用于做保护工作的互斥量),直到另一线程完成工作时对这个标识进行重置。

2023-11-02 23:39:38 169

原创 C++并发编程实战——03.共享数据

使用多个互斥量保护所有的数据,细粒度锁也有问题。互斥量保护一个独立类的实例,锁的状态的下一个阶段,不是离开锁定区域将锁定区域还给用户,就是有独立的互斥量去保护这个类的全部实例,都不好。当多个互斥量在是在同一级上时,不能同时持有多个锁,所以“手递手”的方案需要每个互 斥量在一条链上,并且每个互斥量都比前一个有更低的层级值,这在某些情况下无法实现。这里需要另一种不同的互斥量,这种互斥量常被称为“读者-作者锁”,因为其允许两种不同的使用方式:一个“作者”线程独占访问和共享访问,让多个“读者”线程并发访问。

2023-11-02 23:35:15 79

原创 C++并发编程实战——02.线程管理

每个程序至少有一个执行main()函数的线程,创建std::thread对象就是启动线程,之后需要等待这个线程结束。分离线程只能确定线程什么时候结束,发后即忘(fire and forget)的任务使用到就是分离线程。类似,不同是的添加了析构函数。当你需要对等待中的线程有更灵活的控制时(线程等待或查看是否结束)需要使用其他机制来完成,比如条件变量和。当原对象是临时变量时,则自动进行移动操作,但当原对象是一个命名变量,转移的时候就需要使用。如果不相等,那么就代表了两个不同线程,或者一个有线程,另一没有线程。

2023-11-02 23:33:47 67

原创 C++并发编程实战——01.并发与并行

从1998标准中完全缺乏支持,经历了各种平台相关的扩展,再到C++11/C++14/C++17标准和并发技术规范对多线程的支持。芯片制造商选择了以多核芯的形式,使得更多任务可以同时执行的方式来增加处 理能力,而不是增加单个核心的执行速度。在这个趋势下,C++多线程来的正是时候,它使得开发者们可以利用CPU带来的更加强大的硬件并发。

2023-11-02 23:32:02 117

原创 设计模式——15.Mediator中介者

用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖→运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互。将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联"为"多个对象和一个中介者关联",简化了系统的维护抵御了可能的变化。随着控制逻辑的复杂化,Mediato俱体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

2023-10-12 08:40:30 32

原创 设计模式——14.Adapter适配器

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。//目标接口(新接口)public://遗留接口(老接口)public://遗留类型//....//对象适配器(继承新接口+组合老接口)class Adapter: public ITarget{ //继承protected://组合public://现实中,新旧转换可能很复杂,这里只是伪码//类适配器。

2023-10-11 23:58:29 26

原创 设计模式——13.Proxy代理模式

为其他对象提供一种代理以**控制(隔离,使用接口)**对这个对象的访问。“增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来许多问题,作为间接层的proxy对象便是解决这一问题的常用手段。具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如技术,有些可能对组件模块提供抽象代理层,在建构层次对对象做proxy。Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。

2023-10-11 23:57:28 26

原创 设计模式——12.Façade门面模式

为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。从客户程序的角度来看,Facade模式简化了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade更多时候更是一种架构设计模式。Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。

2023-10-11 23:56:11 24

原创 设计模式——11.Flyweight享元模式

运用共享技术有效地支持大量细粒度的对象。//实际实现中差别很大private:string key;else{//...面向对象很好地解决了抽象性的问题,但是作为—个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数。

2023-10-11 23:53:50 22

原创 设计模式——10.Singleton单件模式

保证一个类仅有一个实例,并提供一个该实例的全局访问点。private:public://线程非安全版本//线程安全版本,但锁的代价过高Lock lock;//双检查锁,但由于内存读写reorder不安全Lock lock;//C++11版本之后的跨平台实现 (volatile)//获取内存fence//释放内存fencereturn tmp;Singleton模式中的实例构造器可以设置为protected以允许子类派生。

2023-10-11 23:52:25 23

原创 设计模式——09.Builder构建器

将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。public://House(){//C++不能直接在构造函数中使用虚函数。在这种情况下虚函数都是静态绑定(子类的构造函数,会先调用父类的构造函数,子类都没有诞生,父类调用子类的override函数不合理)//很像Template Methodi<4;i++){protected:protected:将House的表示及构造进行拆分,即House和HouseBuilder;

2023-10-11 23:48:38 22

原创 设计模式——08.Prototype原型模式

使用原型实例指定创建对象的种类,然后通过(深)拷贝这些原型来创建新的对象。//原型对象public://克隆原型//内存管理//具体类public:public:public:public://抽象类public://通过克隆自己来创建对象Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些**“易变类"拥有“稳定的接口"**。

2023-10-11 23:47:04 31

原创 设计模式——07.AbstractFactory抽象工厂

可以把工厂方法视为抽象工厂的一种特例,一起叫做工厂方法。提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。public:如果将MySql改为Oracle,SqlConnection、SqlCommand和SqlDataReader都要重写。程序不应该依赖于具体的数据库类型。//数据库访问有关的基类及其工厂//支持SQL Server或者Oracle(实际工程实现,以下四个放在另一文件中)

2023-10-11 23:45:44 24

原创 设计模式——06.FactoryMethod工厂方法

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。public:private:public://依赖具体类使用抽象基类、抽象基类继承后的具体类、工厂基类、工厂基类继承后的具体类。

2023-10-11 23:44:16 20

原创 设计模式——05.Bridge桥模式

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。Bridge模式的应用一般在“两个非常强的变化维度。

2023-10-11 23:41:47 14

原创 设计模式——04.Decorator装饰模式

动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码子类个数通过采用组合而非继承的方法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承而带来的“灵活性差”和“多子类衍生问题”。Decorator类在接口上表现为is-aComponent的继承关系,即Decorator类继承了Component类所具有的的结构。但在实际表现上又表现为has-a。

2023-10-11 23:40:21 22

原创 设计模式——03.Observer/Event观察者模式

定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。使用面向对象的抽象,Observer模式使得我们可以**独立地改变(松耦合)**目标与观察者,从而使二者之间的依赖关系达致松耦合。目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。

2023-10-11 23:36:55 62

原创 设计模式——02.Strategy策略模式

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在**运行时**方便地根据需要在各个算法之间进行切换。Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

2023-10-11 23:35:34 12

原创 设计模式——01.TemplateMethod模板方法

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。延迟到子类:定义可能变化的部分为一个虚函数,并让子类实现/重写这个虚函数。Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

2023-10-11 23:34:07 14

原创 设计模式——00.概述与原理

软件设计的目标在于增加软件的复用性。分解:将大问题分解为多个小问题,复杂问题分解为多个简单问题。抽象:将复杂对象忽略非本质的细节,抽象去处理泛化和理想化的对象模型。统一处理提高代码复用性什么是设计模式?每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心,这样,你就能一次又一次地使用该方案而不用重复劳动,提高代码复用性。软件设计复杂的根本原因:变化客户需求变化技术平台变化开发团队变化市场环境变化而一个好的设计,在于软件的复用性。面向对象的复用性是指。

2023-10-11 23:29:19 25

原创 Effective C++第九章笔记

文章目录九、杂项讨论条款53:不要轻忽编译器警告条款54:让自己熟悉包括TR1在内的标准程序库条款55:让自己熟悉Boost九、杂项讨论条款53:不要轻忽编译器警告一旦从某个特定编译器的警告信息中获取经验,将学会了解不同的信息意味什么,那往往和它们“看起来”的意义十分不同。对警告信息深刻理解后,就可以选择忽略某些警告信息。警告与编译器相依,不同编译器有不同警告标准。草率编程指望编译器为你指出错误,不可取。注意:严肃对待编译器发出的警告信息。努力在编译器的最高警告级别下争取“无任何警告”的荣誉。不要

2022-04-16 19:05:58 438

原创 Effective C++第八章笔记

文章目录八、定制new和delete条款49:了解new-handler的行为条款50:了解new和delete的合理替换时机条款51:编写new和delete时需固守常规条款52:写placement new也要写placement delete八、定制new和delete相比Java中的垃圾回收机制,C++使用手工管理内存并获得最佳效率。当new和delete无法满足内存需求时,new-handler将被调用。由于heap是一个可被改动的全局资源,多线程可产生疯狂访问这类资源的竞速状态(race c

2022-04-16 19:05:00 621

原创 Effective C++第七章笔记

文章目录七、模板与泛型编程条款41:了解隐式接口和编译期多态条款42:了解typename的双重意义条款43:学习处理模板化基类内的名称条款44:将与参数无关的代码抽离template条款45:运用成员函数模板接受所有兼容类型条款46:需要类型转换时请为模板定义非成员函数条款47:请使用traits class表现类型信息条款48:认识template元编程七、模板与泛型编程C++template从泛型编程发展为模板元编程。条款41:了解隐式接口和编译期多态面向对象编程世界总是以显式接口(expli

2022-04-16 19:03:40 430

原创 Effective C++第六章笔记

文章目录六、继承与面向对象设计条款32:确定你的public继承塑模出is-a关系条款33:避免遮掩继承而来的名称条款34:区分接口继承和实现继承条款35:考虑virtual函数以外的其他选择条款36:绝不重新定义继承而来的non-virtual函数条款37:绝不重新定义继承而来的缺省参数值条款38:通过复合塑模出“has-a”或“根据某物实现出”条款39:明智而审慎地使用private继承条款40:明智而审慎地使用多重继承六、继承与面向对象设计继承分为单一继承或多重继承;继承连接(link)分为pub

2022-04-13 17:08:16 171

原创 Effective C++第五章笔记

文章目录五、实现条款26:尽可能延后变量定义式的出现时间条款27:尽量少做转型动作条款28:避免返回handles指向对象内部成分条款29:为“异常安全”而努力是值得的条款30:透彻了解inlining的里里外外条款31:将文件间的编译依存关系降至最低五、实现适当的提出class(template)和function(template)声明,是最费时费力的事儿,其实现反而直截了当,但仍然有东西需要小心。太快定义变量可能造成效率上的拖延;过度使用转型可能导致代码变慢又难维护,又找来微妙难解的错误;

2022-04-11 21:43:55 886

原创 Effective C++第四章笔记

4.设计与声明文章目录4.设计与声明条款18:让接口容易被正确使用,不易被误用防止误用促进正确使用cross-DLL problem(不同模块间申请和释放内存)条款19:设计class犹如设计type条款20:宁以pass-by-reference-to-const替换pass-by-value条款21:必须返回对象时,别妄想返回其reference条款22:将成员变量声明为private条款23:宁以non-member non-friend函数替换member函数条款24:若所有参数皆需类型转换,请为

2022-04-07 18:06:13 729

原创 Effective C++第三章笔记

Effective C++第二章笔记文章目录Effective C++第二章笔记3.资源管理条款13:以对象管理资源条款14:在资源管理类中小心copying行为条款15: 在资源管理类中提供对原始资源的访问条款16: 成对使用 new 和 delete 时要采取相同形式条款17:以独立语句将newed对象置入智能指针3.资源管理资源指动态分配内存(不归还会导致内存泄漏)、文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面字型笔刷、数据库连接及Soc

2022-04-05 18:47:32 388

原创 Effective C++第二章笔记

Effective C++第二章笔记文章目录Effective C++第二章笔记2.构造/析构/赋值运算条款05:了解C++默默编写并调用哪些函数条款06:若不想使用编译器自动生成的函数,就该明确拒绝条款07:为多态基类声明virtual析构函数条款08:别让异常逃离虚构函数条款09:绝不在构造和析构过程中调用virtual函数条款10:令operator=返回一个reference to *this条款11:在operator=中处理“自我赋值”条款12:复制对象时勿忘其每一个成分2.构造/析构/赋值

2022-04-04 20:07:06 665

原创 Effective C++第一章笔记

Effective C++第一章笔记文章目录Effective C++第一章笔记导读术语命名习惯线程TR1和Boost1.让自己习惯的C++条款01:视C++为一个语言联邦条款02:尽量用const,enum,inline替换#define条款03:尽可能使用const条款04:确定对象被使用前已被初始化导读中英词汇对照见目录前表格。该书用于强调C++编程中被漠视的编程方向及观点,回避编译器难以显露的问题并重视移植性。同时,注意没有任何条款放之四海而皆准,只是有指南性质,准则天生带有例外,盲目使用不

2022-04-04 20:05:14 443

原创 一个输入图像并使用threshold/OSTU的bug

为了将图像使用OSTU阈值处理后续的steger光条中心提取(发现高斯模糊后,杂点多)一直报错:Error: Assertion failed (src.type() == CV_8UC1) in cv::threshold图像格式不匹配尝试使用类型转换: input_img.convertTo(out,CV_8UC);//或 for (int i = 0; i < input_img.rows; i++) { for (int j = 0; j < input_img.col

2021-04-13 19:16:30 201

原创 卡了许久的CMake小bug

使用CMake构建PCL项目,出现大量警告编译器选择时,需注意win32/x64在PCLConfig.cmake文件中 cmake_policy(PUSH)取消注释,cmake_policy设为新if(POLICY CMP0074) # TODO: update *_ROOT variables to be PCL_*_ROOT or equivalent. # CMP0074 directly affects how Find* modules work and *_ROOT vari

2021-04-10 21:29:53 3421 3

原创 基于C++11实现多线程编程

基于C++11实现多线程编程文章目录基于C++11实现多线程编程thread.h 线程thread/this_thread类mutex.h 互斥量**mutex**、recursive_mutex(递归互斥锁)、timed_mutex(定时互斥锁)及recursive_timed_mutexlock_guard(将mutex托管,避免忘记解锁)unique_lock (lock_guard有的功能它都有,项目中也使用这个)condition_variable.h 条件变量condition_variabl

2021-04-09 22:40:21 244

原创 显示法线bug

显示法线bug//visualize the normals if (VISUAL = 1) { cout << "click q key to quit the visualizer and continue!!" << endl; boost::shared_ptr<pcl::visualization::PCLVisualizer> MView(new pcl::visualization::PCLVisualizer("Showing normals

2021-03-31 20:05:42 335

原创 搭建线结构光点云获取平台遇到的问题

搭建线结构光点云获取平台遇到的问题1.cv::calibrateCamera()该问题是在进行光平面标定中遇到该函数可经过标定,获取旋转平移矩阵rvecs和tvecs官方文档中对于rvecs,本人翻译为:将校准图案从模型坐标系(相机坐标系)转换到世界坐标系然而,该矩阵是通过将校准图案从世界坐标系转换到模型坐标系(相机坐标系)更多细节可见计算机视觉基础2. 光平面参数(a b c d)标定是基于相机坐标系标定的3. 为提高点云获取速度,需要设置合适的ROI区域,减少计算量4. 图像时间

2021-03-31 19:50:28 289 1

原创 快速熟悉STL中的容器及其操作

快速熟悉STL中的容器及其操作官方说明在线c++编译器Container class templatesSequence containers:array Array class (class template )vectorVector (class template )dequeDouble ended queue (class template )forward_list Forward list (class template )listList ..

2021-01-01 17:09:32 145

原创 Typora-Markdown相关语法与快捷键

Typora-Markdown文章目录Typora-Markdown快捷键标题目录代码块列表字体格式斜体/粗体下划线高亮上下标分割线删除线表格区块链接注快捷键加粗:Ctrl + B斜体:Ctrl + I下划线:Ctrl + U超链接:Ctrl + K行内代码:Ctrl + Shift + `代码块:Ctrl + Shift + K图片:Ctrl + Shift + I大纲:Ctrl + Shift + L公式:Ctrl + Shift + M撤销:Ctrl +Z专注模式:F8打

2020-07-15 14:45:36 203

原创 第一篇博客

第一篇博客之前一直使用onenote记笔记,感觉笔记更需要分享出来交流学习,看到课题组师兄在用Typora,之前也试过Markdown。不过感觉onenote好用就放弃了。现在开始打算开始在CSDN上记录笔记心得,以前的笔记看看要不要整理后搬运一下。另:添加一张图片体验一下编辑器以上!...

2020-07-15 12:20:43 75

空空如也

空空如也

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

TA关注的人

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