C/C++学习系列笔记
文章平均质量分 55
源码很重要
妖怪喜欢风
该去做自己喜欢的事了
展开
-
C++11特性:std::lock_guard是否会引起死锁?
今天在评审代码的时候,因为位于两个不同的线程中(一个是周期性事件线程,一个是触发式事件线程),需要对一个资源类的某些属性进行互斥的访问,因此采用lock_guard互斥量包装器,但是在升级的过程中,因为整个系统太大,所以在询问了某位同事后,得到的答案是在两个不同的地方加上lock_guard有一定的可能性会导致死锁,但是后面在测试的过程中又没有问题,真的如此吗?本文针对lock_guard来做阐述和延申。原创 2024-03-24 11:07:12 · 1430 阅读 · 0 评论 -
软件测试:LLVM中的Fuzz模糊测试框架——libFuzzer
是LLVM生态系统中的一个模糊测试工具,用于自动化地发现软件程序中的漏洞和错误。它通过生成大量的随机输入数据并观察程序的行为来进行模糊测试。libFuzzer是一个基于内存的模糊测试引擎,使用LLVM的插桩技术和代码优化功能来提高测试效率和覆盖率以下是 libFuzzer 的一些功能特点:libFuzzer提供了一种自动化的模糊测试方法,可以生成大量的随机输入数据,并在每个输入上运行目标函数进行测试。它通过观察程序的崩溃、断言失败、未定义行为等反馈来发现潜在的问题。libFuzzer通过使用和。原创 2024-03-21 00:00:00 · 911 阅读 · 0 评论 -
软件测试:C++ Google Test单元测试框架GTest
最近在写项目的时候,学到了许多关于软件测试的知识,也不断的使用新的测试框架和测试工具,每次总是机械式的拼接其他人的代码,代码发生错误也不知道怎么解决,因此我打算直接将其学一遍原创 2024-03-19 22:53:52 · 871 阅读 · 0 评论 -
C++模板编程高级技巧
因此,模板的实现也应该放在头文件内,此时在其他代码文件中可以直接将模板的实现也包含进来,当需要生成模板实例时,编译器可根据已知模板实现当场生成,从而无需依赖在别的目标文件中生成的模板实例。标记,并且在函数及类模板的实现中,模板参数是用于指代具体类型,因此,这两个关键字标记类型的模板参数被称为类型模板参数,除此之外,还有以下四种类型。以上四种参数统称为非类型模板参数,其在模板参数列表中的声明方式与对应类型的变量声明一致,此外模板参数还可以是一个模板,称为模板模板参数。或者给定一个迭代器类型,求出其标签类型)原创 2023-01-24 22:32:24 · 634 阅读 · 0 评论 -
编程中的程序编码问题
ASCII码表链接ASCII是美国标准,所以它不能良好满足其它国家的需要。ANSI编码表示英文字符时用一个字节,表示中文时用两个或四个字节。Unicode编码但是问题在于,原本可以用一个字节存储的英文字母在Unicode里面必须存两个字节,这就产生了浪费。那么有没有一种既能消除乱码,又能避免浪费的编码方式呢?答案就是UTF-8!在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符原创 2022-06-07 18:49:49 · 325 阅读 · 1 评论 -
并发编程的一些解决方法和解决方法案例
CAS算法Compare & Set/Compare & Swap,CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制。假设内存中的原数据V,旧的预期值A,需要修改的新值B比较 A 与 V 是否相等如果比较相等,将 B 写入 V返回操作是否成功代码示例bool compare_and_swap (int *accum, int *dest, int newval){ if ( *accum == *dest ) {原创 2022-02-23 19:19:09 · 357 阅读 · 0 评论 -
C/C++项目实战:高性能社交平台(SPP2)
高性能社交平台项目简述性能采集后期构思前言:要和C/C++短暂地说再见啦,暂时用不到了,等几个月后我再来重回辉煌,这个项目就权且作为我的一个收官之作吧,也不算辜负这两年的C/C++学习了。Github repository:SSP-0.2项目简述基于均衡模型的C/S架构。在前端,客户端采用QtCreator,客户端和服务器使用消息机制进行通信,并采用protobuf协议进行收发包。在服务器方面,采取epoll的io多路复用的主从反应堆,运用one thread one loop的模式接收消息,对原创 2022-02-04 00:42:06 · 1877 阅读 · 0 评论 -
GPL协议和GNU系统
在C++SGI-STL3.3时看到了一个词copyright/* * Copyright (c) 1996-1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * prov原创 2021-09-22 16:22:34 · 294 阅读 · 0 评论 -
懒汉模式和饿汉模式
单例模式(Singleton Pattern)是 各种编程语言中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。一个类只能有一个实例化的对象,那么这个类就要禁止别人new出来,或者通过直接定义一个对象出来如果把构造函数私有化,很明显上面这两种方法都会默认的去调用构造函数,当构造函数是private或者pro原创 2021-04-14 21:16:55 · 219 阅读 · 0 评论 -
策略模式
策略模式是组件协作的一种,是一种面向对象原则下的产物传统的组件协作是根据过程式语言而形成的,但是这种会破坏数据之间的关联性且不易维护int main() { int n = 9; if (n == 1) {} // 条件判断 else {} return 0;}因此在面向对象的原则下采用类的继承特性,具体问题用具体的策略#include <iostream>using std::cout;using std::endl;class Animal {public:原创 2021-04-16 18:00:00 · 85 阅读 · 0 评论 -
设计模式(3):观察者模式
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。构成:抽象主题(Subject)角色:抽象主题角色提供维护一个观察者对象聚集的操作方法,对聚集的增加、删除等。具体主题(ConcreteSubject)角色:将有关状态存入具体的观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色负责原创 2021-05-15 14:07:46 · 138 阅读 · 0 评论 -
深度探索C++对象模型(3):Data语意学(The Semantics of Data)
Data语意学(The Semantics of Data)Data语意学知识引导Data Member的绑定Data Member的布局Data Member的存取Static Data MembersNostatic Data MembersData语意学知识引导前面讲解部分本身是不用说明的,但是因为他的特殊性我还是得记录一下。class X {}; // 1class A: virtual X {}; // 8class B: virtual X {}; // 8class Y:原创 2021-06-29 19:22:39 · 170 阅读 · 1 评论 -
深度探索C++对象模型(1):关于对象(C和C++的区别)
关于对象加上封装后的布局成本C++对象模型简单对象模型表格驱动型模型C++对象模型对象模型如何影响程序关键词所带来的差异关键词的困扰对象的差异指针的类型加上多态之后在C语言中,“数据”和“处理数据的操作(函数)是分开声明的”,也就是说,语言本身并没有支持“数据和函数”之间的关联系,我们把这种程序方法称为程序性的,由一组“分布在各个一功能为导向的函数中”的算法所驱动,他们处理的是共同的外部数据,如// t.cint func(int); // 函数声明int func(int n) { retur原创 2021-06-26 17:22:47 · 277 阅读 · 0 评论 -
深度探索C++对象模型(2):构造函数语意学
构造函数语意学构造函数语意学Default Constructor的构造操作"带有Default Constructor"的Member Class Object"带有Default Constructor"的Base Class"带有一个Virtual Function"的Class"带有一个Virtual Base Function"的ClassCopy Constructor的构造操作Default Memberwise InitializationBitwise Copy Semantics(位逐次原创 2021-06-28 02:45:59 · 390 阅读 · 1 评论 -
C++多线程进阶
C++多线程进阶unique_lock三大参数对象condition_variable条件变量async&future异步任务packaged_task任务打包promise赋值取用unique_lock三大参数对象adopt_lock:表示已经lock了,无需再次lock了#include <mutex>#include <thread>#include <iostream>std::mutex my_mutex;void func01() {原创 2021-02-11 02:55:57 · 267 阅读 · 0 评论 -
多线程编程与资源同步API和示例
目录1 线程的基本概念及常见问题1.1 主线程退出,支线程也将退出吗1.2 某个线程崩溃,会导致进程退出吗2 线程的基本操作2.1 创建线程2.2 获取线程ID2.1 等待线程结束4 整形变量的原子操作5 Linux线程同步对象5.1 Linux互斥体5.2 Linux的信号量5.3 Linux条件变量5.4 Linux读写锁6 Windows线程同步对象7 C++11/14/17线程同步对象8 经验总结8.1 减少锁的使用次数8.2 减小锁的粒度9 线程局部存储10 环形队列和IO多路复用代码示例引言:原创 2021-12-04 18:04:06 · 1104 阅读 · 0 评论 -
01 C++多线程
多任务处理之一:多进程和多线程1.进程和线程的区别a、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)b、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。c、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC原创 2021-02-06 01:16:58 · 139 阅读 · 0 评论 -
Linux下的多线程编程pthread
引入头文件#include <pthread.h>接下来来看看具体的实际的用法pthread_create概念:创建一个线程// td.cpp#include <pthread.h>#include <iostream>void* fun(void* arg);int main() { pthread_t pid; pthread_create(&pid, NULL, fun, NULL); pt原创 2021-03-14 21:01:52 · 505 阅读 · 0 评论 -
多线程、进程锁机制的作用
为了最大程度上了解锁的机制,此处使用C++来进行编码(python其实也比较好哈哈哈哈)以下代码为不加锁的时候的代码,毫无疑问是乱序的,因为两个线程同时操作了全局变量#include <thread>#include <iostream>#include <mutex>#include <list>// 全局变量std::mutex my_mutex;list<int> L;// 写入函数void func1() { for原创 2021-02-10 17:21:23 · 1111 阅读 · 0 评论 -
02 C++多线程
线程之间共享资源详情请见银行家算法此时就意味着我们需要给线程加上锁保证每个线程能够独立的不受其他线程影响的运行解决竞争条件产生的问题的解决方案通常有两个修改数据结构的设计,被称为无锁编程;使用互斥元保护共享数据。// 引入头文件#include <muntex>// 定义全局锁std::mutex my_mutex;my_mutex.lock() // 上锁my_mutex.unlock() // 解锁/* 但是显然这个不太方便,因为要每次都要解锁,可能会忘记,原创 2021-02-07 14:30:08 · 97 阅读 · 0 评论 -
STL源码剖析:一文看懂vector全构造
vector#include <vector>其主要包括以下部分#ifndef __SGI_STL_VECTOR#define __SGI_STL_VECTOR#include <stl_range_errors.h>#include <stl_algobase.h>#include <stl_alloc.h>#include <stl_construct.h>#include <stl_uninitialized.h&原创 2021-06-01 17:12:44 · 319 阅读 · 0 评论 -
STL源码剖析(5):配接器
配接器中,改变仿函数的接口者,称为function adapter,改变容器接口者,称为container adapter,改变迭代器接口者,称为iterator adapter应用于容器,container adapter即STL提供的两个容器queue和stack,其实都只不过是一种配接器,他们修饰deque的接口而成就出另一种容器风格。应用于迭代器,iterator adapter包括insert iterator,reverse iterator,iostream iterator,C++原创 2021-03-18 12:59:55 · 159 阅读 · 0 评论 -
STL源码剖析(9):Iterator adaptor
配接器(adaptor)在STL组件的灵活组合运用功能上,扮演者轴承、转换器的角色。配机器分类:container adapters,iterator adapters,functor adapters。下面来以iterator adapters来做例子// C++ standard规定他们的接口在#include <iterator>// SGI STL将他们实际定义于#include <stl_iterator.h>主要有三类iterator adapters:i原创 2021-05-09 17:43:17 · 273 阅读 · 0 评论 -
defalloc.h
在SGI3.3中可以看见一个defalloc.h,这个文件是做什么的呢?来看看内容// Inclusion of this file is DEPRECATED. This is the original HP// default allocator. It is provided only for backward compatibility.// This file WILL BE REMOVED in a future release.//// DO NOT USE THIS FILE原创 2021-06-01 22:22:27 · 155 阅读 · 0 评论 -
Windows多线程及其相关标准库源码剖析(3):condition_variable
A condition variable is an object able to block the calling thread until notified to resume.It uses a unique_lock (over a mutex) to lock the thread when one of its wait functions is called. The thread remains blocked until woken up by another thread that.原创 2021-04-19 11:21:24 · 316 阅读 · 0 评论 -
STL源码剖析---算法(algorithm)
算法(algorithm)算法概观算法分析和复杂度表示O()质变算法非质变算法数值算法 算法概观再好的编程技巧,也无法让一个笨拙的算法起死回生,选择了错误的算法,便注定了失败的命运以有限的步骤,解决逻辑或数学上的问题,这一专门科目我们称为算法(Algorithms)广义而言,我们所写的每个程序都是一个算法,其中的每个函数也都是一个算法毕竟他们都是用来解决问题或大或小的逻辑问题或数学问题。本节主要探讨的是70余个STL算法算法分析和复杂度表示O()质变算法所谓“质变算法”,是指运算过程中更改区原创 2021-06-06 15:09:30 · 294 阅读 · 0 评论 -
STL源码剖析:迭代器:stl_iterator_base.h和iterator_traits
iterator其中主要包括两个文件#include <stl_iterator_base.h>#include <stl_iterator.h>stl_iterator_base.h在这个文件中主要是重命名和进行一些简单的函数操作各个迭代器之间的关系struct input_iterator_tag {};struct output_iterator_tag {};struct forward_iterator_tag : public input_iterat原创 2021-06-02 02:20:21 · 857 阅读 · 3 评论 -
Windows多线程及其相关标准库源码剖析(2):mutex
mutex其他函数锁类lock_guardunique_lock数据类型类adopt_lock_t在使用多线程的时候,各个线程如果要对一个变量进行操作的时候,就会出现共享问题,此时应该规定次序关系,此时就要用上mutex了,发生互斥,隐式避免数据竞争此文件中主要包含三种类其他函数锁类数据类型类互斥量类其他函数有三个函数try_lock,lock,call_once,这三个函数主要在_Mutex_base类中class _Mutex_base { // base class for al原创 2021-04-19 00:06:40 · 773 阅读 · 2 评论 -
STL源码剖析(3):deque,以及C/C++下的stack,queue实现
接下来咱们来看看dequedequedeque,简称双端队列,顾名思义,就是两端都可以进行进出操作,即双向开口的连续线性空间。vector当然也可以在头尾两端进行操作,但是其头部操作效率奇差,无法被接受deque的中控器deque系由一段定量连续空间组成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接deque的头端额尾端。换来的是极其复杂的迭代器。deque采用一块所谓的map(不是map容器)作为主控,是 一小块连续空间,其中每个元素都是指针,指向另一端的连续空间原创 2021-03-12 12:20:10 · 292 阅读 · 0 评论 -
STL源码剖析(2):序列式容器之基础:vector
第一次写STL的容器,先来介绍一下序列式容器吧。序列式容器,其中的元素都可序,但未必有序,C++语言本身提供了一个序列式容器array,STL另外再提供vector(数组),list(双向链表),deque(双端队列),stack(栈),queue(队列),slist(单链表),priority-queue(优先队列),heap(堆)等等序列式容器,其中stack,queue由于只是将deque改头换面而成,技术上被归类为一种配接器而对于关联式容器,STL可将其分为set(集合)和map(映射表)两大类原创 2021-03-11 20:29:37 · 171 阅读 · 0 评论 -
STL:vector源码解析
vector维护的是一个连续空间,所以不论其元素型别如何,普通指针都可作为vector的迭代器而满足所有条件。vector的迭代器// T:数据类型,alloc:空间配置器template <class T, class Alloc = alloc>class vector { public: typedef T value_type; // vector的迭代器是普通指针 typedef value_type* iterator;}vector的数据结构temp原创 2021-03-02 10:38:03 · 706 阅读 · 0 评论 -
STL源码剖析(6):sort算法的内核
已知,set,multiset,map,multimap是由于RB_tree形成的,具有自动排序的功能(具体可见RB_tree红黑树的形成),不用sort排序算法,而且类似的用hash_map形成的unordered_set,unordered_map,unordered_multiset,unordered_multimap是不允许遍历的,所以也用不到排序算法,同样的还有stack,priority_queue。接下来来看看sort的源码剖析先来写一个小程序#include <algorith原创 2021-03-18 16:45:34 · 403 阅读 · 0 评论 -
Windows多线程及其相关标准库源码剖析(1):thread
标准库位置作为一名C++的学习者,想要进阶,阅读源码是必不可少的我们首先来看看源码的位置:首先引入头文件,然后按住CTRL点击进去,可以看到标准库的位置下面来看看源码吧可见thread文件主要包括四个部分thread类命名空间this_threadthread的内部类id解释部分#if _HAS_CXX20class jthread;#endif // _HAS_CXX20此处意思是如果是cpp20,则使用jthread类,此类在该头文件中也已经定义了,可见,其内容和th原创 2021-04-18 20:50:00 · 757 阅读 · 0 评论 -
STL源码总结:关于vector的每一部分的全详解
首先来看看array和vector的对比:vector的数据安排以及操作方式,与array非常相似,两者唯一的差别在于空间运用的灵活性,array是静态空间,一旦配置了就不能改大小,vector是动态空间,随着元素的加入,他的内部机制会自学扩充新元素(配置新空间—数据移动—释还原空间),如下std::array<int, 4>;std::vector<int> v;vector的迭代器容器的灵魂是迭代器vector维护的上一个连续线性空间,所以不管其元素型别为何,普通指原创 2021-03-17 23:19:35 · 220 阅读 · 0 评论 -
STL源码剖析(8):list双向链表及其与STL整体架构
list及其与STL整体架构listnode:list的节点iterator:list的迭代器list的数据结构list的构造和内存管理list的元素操作和算法的配合使用STL分成六大部分:容器(container)、算法(algorithm),迭代器(iterator)、配接器(adapter)、仿函数(functor)、配置器(allocator)此处先来介绍一下list(双向链表)list相较于vector的连续线性空间,list就显得复杂很多,他的好处是每次插入或删除一个元素,就配置一个元素原创 2021-04-25 21:41:25 · 262 阅读 · 0 评论 -
STL源码剖析(1):迭代器Iterator
自述:迭代器真是一个神奇的部件,连接算法和容器,不论是看书还是看视频,看迭代器一部分是无用的,必须把所有的关联起来看。作为STL的六大部件,迭代器无疑是极其重要的一环。先来看看《Design Patterns》一书中对他定义:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素怒,而又无需暴露该聚合物的内部表述方式推荐书籍:《STL源码剖析—侯捷》《Effective C++ —侯捷》STL的中心思想在于,将数据容器和算法分开,彼此独立设计,最后在一一粘胶剂将题目撮合到一起,容原创 2021-03-09 22:10:49 · 224 阅读 · 0 评论 -
STL源码剖析(4):六大部件之仿函数functional
仿函数作为六大部件中的最简单的,应该是最好理解的啦导入头文件#include <functional>函数对象重载函数调用操作符的类,其对象常称为函数对象;函数对象使用重载的()类时,行为类似函数调用,也叫仿函数;特点:函数对象在使用的时,可以像普通函数那样调用,可以有返回值;函数对象超出普通函数的概念,函数对象可以有自己的状态;函数对象可以作为参数传递;// 函数对象在使用的时,可以像普通函数那样调用,可以有返回值;class MyAdd{原创 2021-03-12 14:55:14 · 253 阅读 · 0 评论 -
STL源码剖析(7):空间配置器
空间配置器具有次配置力的SGI空间配置器SGI标准的空间配置器,std::allocatorSGI特殊的空间配置器构造和析构基本工具:construct()和destroy()空间的配置和释放第一级配置器__malloc_alloc_template第二级配置器__default_alloc_template空间配置函数allocate()deallocate()同理重新填充free lists关于C++new和delete此处不做详解,可见:new和delete之美本篇文章以讨论STL的空间配置器为主原创 2021-04-01 19:48:23 · 181 阅读 · 0 评论 -
STL源码剖析:STL内存管理
memory其中主要内含以下两个文件#include <stl_alloc.h> // 负责内存空间的配置和释放#include <stl_construct.h> // 负责对象内容的构造和析构stl_construct.hconstruct构造函数// 单参数构造函数,没有赋给初值template <class _T1>inline void construct(_T1* __p) { _Construct(__p);}templat原创 2021-06-02 01:59:46 · 257 阅读 · 0 评论 -
STL源码剖析:map、multimap和unordered_map、unordered_multimap
map和multimap是由RB-tree构成的,unordered_map和unordered_multimap是由Hashtable构成的相同:两者都是键-值对的集合,关联容器的一种。两者中的元素都是pair,同时拥有实值和键值。两者都不允许有两个相同的键值(实值可以相同)。两个的外部接口调用基本一致。不同:内部实现机理不同,即map内部实现了一个红黑树;unordered_map内部实现了一个哈希表。(两者的比较成为红黑树与哈希表的比较)。由于内部实现机理不同(底层实现)造成以下不同。map的原创 2021-06-02 02:47:10 · 958 阅读 · 0 评论