![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++技术
xin_hen
这个作者很懒,什么都没留下…
展开
-
两种洗牌算法
两种洗牌算法#pragma once#include<vector>class Shuffle {public: //某一个元素放在第i个位置上的概率为: //(n-1)/n * (n-2)/(n-1) *...* (i+1)/(i+2) * 1/(i+1) //=1/n void shuffle1(std::vector<int>&nums) { for (int i = nums.size() - 1; i >= 0; --i) { std原创 2020-09-28 10:56:44 · 319 阅读 · 0 评论 -
模板为什么必须定义在头文件
这是由C++编译器的性质决定的。C++采用了分离式编译的方法,.h头文件仅仅是在预处理阶段进行展开的,真正进行的是对.cpp文件的编译。编译器在编译时,看到模板并不会进行任何操作,而是在模板实际使用时(实例化),才会进行代码生成。如果模板定义放在.h头文件中,模板实现放在.cpp文件中,编译时可以看到模板的声明,但找不到定义,因此会成为外部符号,而在链接时,必然无法找到模板的实现(该外部符号的对应符号),导致链接失败。而如果模板定义在.h头文件中,则可以在编译时就找到模板的定义,进行代码生成。...原创 2020-09-24 20:04:23 · 2433 阅读 · 4 评论 -
C++简单实现HashMap
实现说明线程不安全;2倍扩容,方便使用位运算计算桶位置;但存在极端情况下的弊端;不支持将链表转为红黑树源码#pragma once#include<string>//Hash函数int Hash(int key) { return key;}//线程不安全容器//2倍扩容,方便计算//不支持链表转为红黑树class HashMap { class Node { public: const int key; int val; const int原创 2020-08-22 12:38:31 · 1852 阅读 · 0 评论 -
C++11实现基于链表的自旋锁队列LockFreeLinkedQueue
C++11实现基于链表的无锁队列LockFreeLinkedQueue 无锁队列实现原理源码测试代码运行结果码云链接无锁队列无锁队列一般指的是通过CAS操作来保证队列的线程安全性问题,而不会使得线程陷入到内核,以避免用户态与内核态的切换开销;实现原理采用链表,实现基于自旋锁CAS的无界队列自旋锁方式,对head/tail自旋为NULL 表示成功获取自旋锁:2.1. 在push函数中,对tail成功CAS为Exclude 表示当前线程获取tail自旋锁成功,并设置tail的next节点为push原创 2020-08-21 13:28:27 · 2130 阅读 · 1 评论 -
C++11实现基于循环数组的自旋锁队列LockFreeArrayQueue
C++11实现基于循环数组的无锁队列LockFreeArrayQueue 无锁队列实现原理源码测试代码运行结果无锁队列无锁队列一般指的是通过CAS操作来保证队列的线程安全性问题,而不会使得线程陷入到内核,以避免用户态与内核态的切换开销;实现原理本文采用循环数组,实现无锁队列;自旋锁方式,对front/rear自旋为Exclude 表示成功获取自旋锁:1.1. 在push函数中,对rear成功CAS为Exclude 表示当前线程获取rear自旋锁成功,并需要判断当前数组是否已满,如果已满,则解锁原创 2020-08-21 11:07:24 · 2955 阅读 · 2 评论 -
C++11实现CountDownLatch以及CyclicBarrier
#pragma once#include<assert.h>#include<mutex>#include<atomic>#include<condition_variable>//用于一组线程等待另外count个线程执行任务结束//一次性的class CountDownLatch {private: //计数 std::atomic<int> count; std::mutex mx; std::condition_v原创 2020-08-05 18:19:28 · 1072 阅读 · 0 评论 -
C++实现strcpy、memcpy以及memmove函数
#pragma once#include<string>//需要保证src为C风格字符串//dest缓冲中可以完全放下src//存在内存重叠问题char* strcpy1(char* dest, const char* src) { if (dest == nullptr || src == nullptr) return nullptr; if (dest == src) return dest; char* dst = dest; while ((*dst++ = *src原创 2020-08-05 12:31:21 · 305 阅读 · 0 评论 -
C++的string简单实现(拷贝、移动)
#pragma once#include<vector>using namespace std;class String {private: char* data;public: String(const char* str = NULL); String(const String& other); String(String&& other); String& operator=(const String& other); Stri原创 2020-08-05 12:13:06 · 1364 阅读 · 0 评论 -
多线程循环打印ABC
#include<thread>#include<mutex>#include<condition_variable>#include<iostream>#include<vector>std::mutex mx;std::condition_variable cond1, cond2, cond3;int cnt = 0;void func1() { while (true) { std::unique_lock<原创 2020-08-04 20:15:19 · 174 阅读 · 0 评论 -
C++内存对齐的原则
内存对其规则1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始;2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储;(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)3、收尾工作:结构体的总原创 2020-08-03 10:03:50 · 481 阅读 · 0 评论 -
C++11的多种单例模型实现
C++的多种单例模型实现单例概念单例的懒汉实现单例的饿汉实现有问题的双重检查锁问题源码以上代码的问题原因基于atomic的双重检查锁源码说明参考单例概念单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例的懒汉实现1)利用C++11的static线程安全性class Instance {public: static Instance& getInstance() { static Instance instance; return instance;原创 2020-08-02 16:00:41 · 241 阅读 · 0 评论 -
C++的volatile关键字理解
C++的volatile关键字1)volatile语义是易变的,该修饰的变量可能会突然地、出乎意料地被改变;2)禁止编译器优化;如使得被修饰变量需要每次从内存中读取。因为编译器优化过程,认为这个变量没有被更改的可能性的时候,就会优化成每次从CPU寄存器中读取,导致中断函数的改变对于其是不可见的。3)在多线程下,变量的可见性不能保证。因为多线程变量的可见性的导致原因是CPU为优化导致的多核下的指令乱序。比如CPU的store buffer。某个CPU核在改某一个变量时,为加速,会将其先放在store原创 2020-08-02 10:41:43 · 181 阅读 · 0 评论 -
pure virtual method called错误简记
pure virtual method called错误简记错误1错误源码运行结果说明原因错误1错误源码运行结果说明原因错误1错误源码class Base {public: virtual void foo() = 0; Base() { call_foo(); } void call_foo() { foo(); }};class Derived : Base { void foo() { }};int main() {Derived d;}原创 2020-08-02 10:28:27 · 603 阅读 · 0 评论 -
C++实现循环阻塞队列CycleBlockingQueue
C++实现循环阻塞队列CycleBlockingQueue描述源码CycleBlockingQueue.h描述1)循环阻塞队列采用生产者消费者模式;2)循环阻塞队列内部采用了vector数组(也可使用链表)管理缓冲,并预先分配size+1的空间;3)关于与之前博客中的线程池连用,需要扩展相应的函数接口;源码CycleBlockingQueue.h#pragma once#include<vector>#include<mutex>#include<condi原创 2020-08-02 09:54:57 · 422 阅读 · 0 评论 -
C++实现读写锁ReadWriteLock
C++实现读写锁ReadWriteLock描述使用示例源码ReadWriteLock.h描述1)读写锁基本思想:写者之间互斥、写者和读者之间互斥,而读者之间并不需要互斥2)读写锁分为两种:读者优先和写者优先;读者优先,即当前只要可读,就是可进入的;写者优先,读者需要看看当前是否有写者要读,如果有,则等待至没有写者正在写或者需要写的情况;使用示例#include"ReadWriteLock.h"#include<iostream>#include<vector>#i原创 2020-08-02 09:44:38 · 3447 阅读 · 0 评论 -
C++11实现信号量semaphore
C++11实现信号量semaphore描述源码semaphore.h描述1)信号量是一种线程/进程间同步的一种手段,可以用来管理有限资源的访问;2)互斥锁主要用来进行互斥的,而信号量则是主要用来同步的;3)从使用上来说,互斥锁的lock和unlock必须在同一个线程;而信号量的wait和signal可以在不同的线程;典型的线程同步代码如下所示:#include"semaphore.h"#include<thread>#include<iostream>semaph原创 2020-08-02 09:25:28 · 3656 阅读 · 0 评论 -
corenet轻量级网络库
corenet轻量级网络库介绍软件架构软件架构说明内存池说明安装教程使用说明HttpServer调试简记(2020.05.29)其它参与贡献致谢码云链接介绍本项目提供一种轻量级的网络库,设计思想是one loop per thread + thread pool。项目已实现:1、基于TCP的简单聊天室;2、简单的HTTP服务器(webbench测试的QPS可以达到1万),其中包括功能:用户登录、注册、权限控制、文件上传、文件下载、已上传视频播放、已上传图片展示;(由于使用url传递文件名称,因此展原创 2020-08-01 14:52:36 · 1212 阅读 · 0 评论 -
手动实现C++11的智能指针
手动实现C++11的智能指针unique_ptr功能设计思想源码shared_ptr与weak_ptr功能设计思想源码ref_count.hweak_ptr.hshared_ptr.hunique_ptr功能unique_ptr独占资源,并使用RAII的方式管理资源。设计思想1)仅仅利用RAII的思想取管理资源,即类初始化时,获取资源;类析构时,释放资源;2)并且为了保证资源独占性,禁用了拷贝函数;源码#pragma oncetemplate<typename T>clas原创 2020-08-01 14:37:49 · 289 阅读 · 0 评论 -
C++11线程池ThreadPool(模仿Java的ThreadPoolExecutor)
C++11线程池ThreadPool功能描述使用示例关键函数说明创建阻塞队列BlockingQueue创建线程池ThreadPool提交任务shutdown线程池设计思想BlockingQueue设计execute执行流程ctl变量设计BlockingQueue必须实现函数说明Task类型实现要求源码BlockingQueue.hThreadPool.h码云链接功能描述实现一种基于C++11的线程池ThreadPool,模仿Java的ThreadPoolExecutor;使用示例#include"T原创 2020-08-01 13:55:24 · 705 阅读 · 0 评论