
c++/CLI
文章平均质量分 80
致守
这个作者很懒,什么都没留下…
展开
-
STL介绍以及其底层实现?包括vector, map, list
STL,Standard Template Library,即标准模板库。包括如下六个组件:它们之间的关系是:分配器给容器分配存储空间,算法通过迭代器获取容器中的内容,仿函数可以协助算法完成各种操作,配接器用来套接适配仿函数。1) 容器vector这些数据结构主要是用于存放数据,STL是一种class temple。array 是固定大小的顺序容器,它们保存了一个以严格的线性顺序排列的特定数量的元素。vector是表示可以改变大小的数组的序列容器底层数据结构为数组,支持快速随机访问。转载 2023-07-03 20:27:20 · 349 阅读 · 0 评论 -
僵尸线程僵尸线程
如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程,从而保证每个进程都会有一个父进程.而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程.4. 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。转载 2022-12-16 14:42:03 · 646 阅读 · 0 评论 -
50个c/c++源代码网站
2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。--以下是一些C和C++库的DLL,VCLs,源代码,元件,模块,应用程序框架,类库,源代码片段等,你可以在您的项目中使用而不需要支付费用和版税。--CodePedia是一个开放的关于系统编程和其他与电脑有关的议题的网站。--布拉德阿普尔顿的C++链接-资源,项目,图书馆,教学和编码。--DANIWEB提供的实用代码段。转载 2022-12-16 10:09:37 · 3564 阅读 · 0 评论 -
值得收藏的5个C++网站
那就来介绍几个最常用的(最好的)吧,包含了参考手册、教程、框架/库列表 ......转载 2022-12-16 10:06:41 · 912 阅读 · 0 评论 -
学习C++的常用网站
中文:https://zh.cppreference.com/w/英文:http://en.cppreference.com/w/C++之父:http://www.stroustrup.com/还有很多没有列出来,如:libuv、libevent、转载 2022-12-16 10:05:01 · 5462 阅读 · 0 评论 -
图解 C++ 中 std::string 的内存布局
上面的汇编代码,其实大部分我都看不懂,主要是注释给了我提醒,那么实现 string 类的代码里,是不是应该有注释里提到的这些方法?为此,我们写了个函数,如方法名所示,获取字符串中的第一个字符,要实现这个功能,汇编代码的执行肯定要涉及上述逻辑。注意:以上的测试基于我当前使用的编译器,根据 StackOverflow 的一些回答,其他的编译器可能有不同的存储策略,本文暂不涉及。同样可以通过修改更长的字符串验证,当字符串长度增长时,分配的堆空间也会增长,而且因为对齐的限制,通常会超过字符串实际长度。转载 2022-11-07 13:22:36 · 3882 阅读 · 2 评论 -
vector容器中erase(删除)的使用
erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器;在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。转载 2022-09-20 14:52:09 · 7899 阅读 · 0 评论 -
C++中清空Vector内元素的方法以及释放内存
这个做法意思就是new了一个新的空的vector,然后交换。erase在每次操作时,迭代器指针会整体前移1,就是每次都会“搬”全部数据,所以。使用 clear ,清空元素,但不回收空间。最简单的使用swap,清除元素并回收。使用 erase循环删除,结果同上。不适合做频繁删除的容器。转载 2022-09-20 14:06:31 · 2147 阅读 · 0 评论 -
STL中Vector和List的底层数据结构
摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set选择问题,并分析了map, set的优势之处。对于希望深入学习STL和希望了解STL map等关联容器底层数据结构的朋友来说,有一定的参考价值。vector(向量)——STL中标准而安全的数组。只能在vector 的“前面”增加数据。deque(双端队列double-ended queue)——在功能上和vector相似转载 2022-08-25 16:35:55 · 594 阅读 · 0 评论 -
Linux内存分配小结--malloc、brk、mmap
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201210975312473/http://blog.sina.com.cn/s/blog_7c60861501015vkk.htmlLinux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址转载 2022-06-30 11:07:38 · 1113 阅读 · 0 评论 -
exit(0)和_exit(0)区别
从图片中我们可以看出,通过exit(0)来结束掉main函数的程序可以输出结果,通过调用_exit(0)函数的程序不能输出结果。(488条消息) exit(0)和_exit(0)区别_托马斯.杨的博客-优快云博客_exit(0)转载 2022-06-15 09:41:16 · 281 阅读 · 0 评论 -
c++笔记 容器 map
1、所有元素都会根据元素的键值自动排序2、所有的元素都是pair,同时拥有键值和实值。 第一个参数:键值 第二个参数:实值3、map容器的键值唯一 不可变 实值 可变。 公司今天招聘了 5 个员工,5 名员工进入公司之后,需要指派员工在那个部门工作 人员信息有: 姓名 年龄 电话 工资等组成 通过 Multimap 进行信息的插入 保存 显示 分部门显示员工信息 显示全部员工信息 vector 的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录, 比如上一次的记录,上转载 2022-06-14 17:29:06 · 445 阅读 · 0 评论 -
超简单的C++去重、排序
一、去重函数头文件:,所以别忘了加上一句:的作用就是数组中重复的元素可以看见最后三个元素是:,而重复的数字是,所以网上有种说法:“unique去重的过程是将重复的元素移到容器的后面去”。上面的返回的是,它就是:。所以,把上面的循环改成:让就是只输出前面不重复的数字,这样就实现的去重的效果。二、去重函数与排序函数结合如果先再那么结果就是:去重毫无作用。因为再排序时会把重复的数字又放在了一起,所以要先再。这点应该好理解,这里提一下。先再代码如下:于是就得到了想要的结果:三、不用去重函数,手转载 2022-06-14 16:58:54 · 11134 阅读 · 0 评论 -
Pthread_Mutex_t Vs Pthread_Spinlock_t (转载)
锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护。Pthreads提供了多种锁机制,常见的有:1) Mutex(互斥量):pthread_mutex_***2) Spin lock(自旋锁):pthread_spin_***3) Condition Variable(条件变量):pthread_con_***4) Read/Write lock(读写锁):pthread_rwlock_***在多线程编中,根据应用场合转载 2022-03-31 11:19:12 · 497 阅读 · 0 评论 -
pthread 各种锁的对比测试
pthread中提供的锁有:pthread_mutex_t, pthread_spinlock_t, pthread_rwlock_t。 pthread_mutex_t是互斥锁,同一瞬间只能有一个线程能够获取锁,其他线程在等待获取锁的时候会进入休眠状态。因此pthread_mutex_t消耗的CPU资源很小,但是性能不高,因为会引起线程切换。 pthread_spinlock_t是自旋锁,同一瞬间也只能有一个线程能够获取锁,不同的是,其他线程在等待获取锁的过程中并不进入睡眠状态,而是在 CP...转载 2022-03-31 10:29:45 · 1780 阅读 · 0 评论 -
【并发编程】Mutex (互斥锁)发展分析
博主介绍:–我是了 凡,喜欢每日在简书上投稿日更的读书感悟笔名:三月_刘超。专注于 Go Web 后端,了解过一些Python、Java、算法、前端等领域。微信公众号【了凡银河系】期待你的关注,企鹅群号(798829931)。未来大家一起加油啊~前言“初版”的Mutex使用一个flag来表示锁是否被持有,实现比较简单;后来照顾到新来的goroutine,所以会让新的goroutine也尽可能地先获取到锁,这是第二阶段,可以称呼为“给新人机会";那么,接下来就是第三阶段”多给些机会“,照...转载 2022-03-30 14:02:54 · 359 阅读 · 0 评论 -
无锁消息队列
一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer目录(一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术(六)RingQueue(中) 休眠的艺术 [续]无锁队列 第一篇文章末尾我们提到的《无锁队列的实现》(陈皓(hào)),该文末尾提到的“用数组实现无锁队列”,即用 RingBuffer 实现的无锁队列: RingBuffer是一个很好的东..转载 2022-03-21 16:55:48 · 623 阅读 · 0 评论 -
【C++】菱形继承
我们先来看下菱形继承的基本视图以及基本的代码结构下面来看下简单的代码以及数据结构: class Person { public: int a_p; }; class Studen :public Person { public: int a_st; }; class Stuff :public Person { public: int a_sf;转载 2022-03-21 16:43:12 · 355 阅读 · 0 评论 -
pthread_cleanup_push与pthread_cleanup_pop的理解
一、为什么会有pthread_cleanup_push与pthread_cleanup_pop:一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放转载 2022-03-21 16:36:09 · 1152 阅读 · 0 评论 -
C++实现真正线程安全的单例
1. 饿汉模式使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。代码实现:2.懒汉模式饿汉方式不论是否需要使用该对象都将其定义出来,可能浪费了内存,或者减慢了程序的启动速度。所以使用懒汉模式进行优化,懒汉模式即延迟构造对象,在第一次使用该对象的时候才进行new该对象。而懒汉模式会存在线程安全问题,最出名的解决方案就是Double-Checked Locking Pattern (DCLP)。使用两次判断来解决线程转载 2022-03-21 14:03:08 · 397 阅读 · 0 评论 -
C语言多线程编程-死锁和线程同步方式介绍(一)
序言实验室项目采用多线程实现,然而暂时只涉及到几个基本的线程操作函数,线程和进程的区别、线程的同步和异步机制以及线程通信等暂时都没有涉及,打算在这里做些总结,以备后用。本文打算学习死锁和线程同步。1. 死锁死锁是指多个线程因竞争资源而造成的一种互相等待的僵局。 举例说明: 资源S1,S2; 进程P1,P2 资源S1,S2都是不可剥夺资源(内存是可剥夺资源):一个进程申请了之后,不能强制收回,只能进程结束之后自动释放; 进程P1申请了资源S1,进程P2申请了资源S2; 接下来P1的..转载 2022-02-26 22:44:53 · 1652 阅读 · 0 评论 -
多线程实现的几种方式
多线程实现一共有四种方式,如下图:- pthread的使用 - 定义pthreadtypedef __darwin_pthread_t pthread_t; - 创建pthreadint pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict, void *(*)(void *), void * __restrict); - 范例void * run(void转载 2022-02-26 22:45:14 · 3802 阅读 · 0 评论 -
Xbox 360 和 Microsof Windows 的无锁编程注意事项
无锁编程是一种在多个线程之间安全共享更改数据的方法,无需获取和释放锁的成本。 这听起来就像一种万能的,但无锁编程是复杂而细微的,有时无法带来它承诺的好处。 无锁编程在应用程序上Xbox 360。无锁编程是多线程编程的有效技术,但不应轻轻松用。 在使用它之前,必须了解复杂性,并且应仔细衡量,以确保它确实可让你获得预期收益。 在许多情况下,有更简单、更快的解决方案,例如不太频繁地共享数据,应改为使用。正确且安全地使用无锁编程需要具备硬件和编译器方面的大量知识。 本文概述了尝试使用无锁编程技术时要考虑的一转载 2022-02-25 16:43:14 · 383 阅读 · 0 评论 -
每天进步一点点——Linux中的线程局部存储(一)
转载请说明出处:每天进步一点点——Linux中的线程局部存储(一)_Cynric 的博客-优快云博客_线程局部存储 在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程..转载 2022-02-25 15:12:19 · 282 阅读 · 0 评论 -
为什么要使用多线程?创建多少个线程合适?什么是线程池?
多线程应用多线程 1、什么是线程? 1.1、任务调度的基本概念 1.2、进程和线程的基本联系 1.3、多线程与多核的基本关系 2、为什么使用多线程? 2.1、并发场景的应用 2.1.1、I/O密集型(I/O bound) 2.1.1.1、单核型应用 2.1.2、CPU (计算)密集型程序((CPU-bound) 2.1.2.1、单核型 2.1.2.2、多核型(并行) ..转载 2022-02-25 15:10:59 · 2382 阅读 · 1 评论 -
Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可与同属一个进程的其它的线程共享进程所拥有的全部资源。当多个任务可以并行执行时,可以为每个任务启动一个线程。线程是并发运行的。在串行程序基...转载 2022-02-25 15:07:27 · 406 阅读 · 0 评论 -
操作系统fork()进程
1、fork()是创建进程函数。2、c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程。3、此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码。4、需要注意!!!子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID(地址);一个代表子进程,值为0。下面写一段代了解了解(注释很重要)运行结果如下父进程printf出来的是子进程 的ID即那串数字,子进程printf的则为0:转载 2022-02-25 10:47:26 · 2247 阅读 · 0 评论 -
fork() 函数简介
fork系统调用用于创建一个新进程,称为子进程,它与进行fork()调用的进程(父进程)并发运行。创建新的子进程后,两个进程都将执行fork()系统调用之后的下一条指令。子进程使用相同的PC(程序计数器),相同的CPU寄存器,相同的打开文件,这些文件在父进程中使用。fork()它不接受任何参数并返回一个整数值。下面是fork()返回的不同值。负值:创建子进程失败。零:返回到新创建的子进程。正值:返回给父亲或调用者。该值包含新创建子进程的进程ID。代码 预测以下程序的运行结果:转载 2022-02-25 10:45:06 · 1502 阅读 · 0 评论 -
linux中fork()函数详解(原创 实例讲解)
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子: 运行结果是: i am t...转载 2022-02-25 10:12:45 · 932 阅读 · 0 评论 -
Linux进程间通信第二讲 管道PIPE FIFO
管道是最古老的IPC之一, 以管道文件作为媒介进行传输其中分为有名管道和无名管道无名管道的管道文件在文件系统中不可见, 而有名可见管道通信实质上是内存通信, 由内核负责一、无名管道(PIPE)只能用于亲缘关系的进程(父子 、 兄弟), 由它的机制决定无名管道的管道文件在文件系统中不可见使用方法:1、父进程调用pipe() 函数创建无名管道, 无名管道有读端 、 写端2、用fork产生子进程, 子进程自动继承父进程的描述符 ,也就是 无名管道的 读端 、 写端3、这是一转载 2022-02-25 09:54:22 · 226 阅读 · 0 评论 -
Linux系统编程pipe()
管道的概述管道也叫无名管道,它是是UNIX系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。无名管道有如下特点:1、半双工,数据在同一时刻只能在一个方向上流动。2、数据只能从管道的一端写入,从另一端读出。3、写入管道中的数据遵循先入先出的规则。4、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。5、管道不是普通的文件,不属于某个文件系统,其只存在于内存中。6、管道在内存中对应一个缓冲区。不同..转载 2022-02-25 09:40:58 · 725 阅读 · 0 评论 -
linux pipe文件系统(pipefs)
linux的pipe,FIFO(named pipe)都是基于pipe文件系统(pipefs)的。linux的pipe和FIFO都是半双工的,即数据流向只能是一个方向;pipe只能在pipe的创建进程及其后代进程(后代进程fork/exec时,通过继承父进程的打开文件描述符表)之间使用,来实现通信;FIFO是有名称的pipe,即可以通过名称查找到pipe,所以没有“只能在pipe的创建进程及其后代进程之间使用”的限制;通过名称找到pipe文件,创建相应的pipe,就可以实现进程间的通信。I.数..转载 2022-02-25 09:25:03 · 1967 阅读 · 0 评论 -
linux管道pipe详解
管道管道的概念:管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:1. 其本质是一个伪文件(实为内核缓冲区)2. 由两个文件描述符引用,一个表示读端,一个表示写端。3. 规定数据从管道的写端流入管道,从读端流出。管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道的局限性:① 数据自己读不能自己写。② 数据一旦被读走,便不在管道中存在,不可反复读取。③ 由于管道采用半双工通转载 2022-02-24 17:58:28 · 7127 阅读 · 0 评论 -
Linux异步管道多线程速率测试
目录结论源代码main.cutils.hutils.cMakefiletest.sh文章链接结论总体上说,由于是异步,多线程发包对单线程的处理不收很大影响,但是包的大小对发包速率影响较大,当宝大小在6500 byte时,发包速率最大,约为9000 Mbps。下面直接给出源码源代码main.c /** * 异步管道 * rongtao@sylincom.com * 2020年8月4日11:11:03转载 2022-02-24 17:51:42 · 449 阅读 · 0 评论 -
Linux下实现多线程异步管道
目录架构代码相关阅读“最近在做F-Stack相关内容,F-Stack协议栈单线程独占异步轮询网卡,所以要求异步。但是又有多线程需要利用F-Stack进行发包,并且发包ff_sendto需要由F-Stack线程调用,就这样引入了此篇命题。”架构代码 /** * 异步管道 * rongtao@sylincom.com * 2020年8月4日11:11:03 */ #include <stdio.h>转载 2022-02-24 17:48:13 · 432 阅读 · 0 评论 -
【C++】vector拷贝使用总结(深复制、浅复制)
文章目录利用拷贝赋值操作符(深复制) 利用拷贝构造(深复制) 利用``swap()``函数(交换两个vector) 利用``assign()``函数(清空并深复制)利用拷贝赋值操作符(深复制)vector<int> array{3,5,2,6,4};vector<int> outArray;outArray = array;利用拷贝构造(深复制)vector<int> array{3,5,2,6,4};vector<int&g转载 2022-02-24 17:43:26 · 17793 阅读 · 1 评论 -
vector的几种初始化及赋值方式
vector的几种初始化及赋值方式:(1)不带参数的构造函数初始化//初始化一个size为0的vectorvector<int> abc;(2)带参数的构造函数初始化//初始化size,但每个元素值为默认值vector<int> abc(10); //初始化了10个默认值为0的元素//初始化size,并且设置初始值vector<int> cde(10,1); //初始化了10个值为1的元素(3)通过数组地址初始化int a转载 2022-02-24 17:42:33 · 2128 阅读 · 0 评论 -
标准库:容纳不完全类型的容器
标准库:容纳不完全类型的容器The Standard Librarian: Containers of Incomplete TypesMatt Austernhttp://www.cuj.com/experts/2002/austern.htm?topic=experts--------------------------------------------------------------------------------在1997 年,C++标准完成前夕,标准化委员会收...转载 2022-02-09 13:41:09 · 145 阅读 · 0 评论 -
文件句柄(file handles) & 文件描述符(file descriptors)
1.概述在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦。在linux操作系统中,文件句柄(包括Socket句柄)、打开文件、文件指针、文件描述符的概念比较绕,而且windows的文件句柄又与此有何关联和区别?这一系列的问题是我们不得不面对的。博主通过翻阅相关资料,并采用了一些demo来验证相关观点。如果文中有理解偏差,欢迎指正,对linux内核不是很熟,持续转载 2022-01-25 15:17:52 · 9362 阅读 · 0 评论 -
C++ STL(第十篇:heap
1、heap的概述heap(堆)并不归属于 STL 容器组件,它是个幕后英雄,扮演 priority queue(优先队列)的助手。priority queue 允许用户以任何次序将任何元素推入容器,但取出时一定是从优先权最高的元素开始取。而 binary max heap(最大二叉堆)具有这样的特性,适合作为 priority queue 的底层机制。 因为后面要整理 priority queue,所以要先把 heap整理好。虽然 binary search tree(二叉搜索树)也可以作为 pri转载 2021-07-12 14:21:39 · 726 阅读 · 0 评论