
C++
文章平均质量分 61
Tannin724
这个作者很懒,什么都没留下…
展开
-
自底向上brpc(二):无锁队列和execution_queue原理
execution_queue的实现非常独特,实现了wait free的入队操作,拥有极高的生产性能。但是消费侧由于断链问题,甚至不是Lock Free的,因为如果生产者在两阶段中间被换出,那么消费者会被这个阻塞传播影响,整个消费也只能先阻塞住。但是在排队写入fd的场景下,专项优化生产并发是合理,也因此可以获得更好的执行效率。总的来说execution_queue是一个非常巧妙的实现,值得我去深入学习。原创 2023-01-19 16:50:46 · 408 阅读 · 0 评论 -
内存性能优化的小结
曾经的我对于cpu cache只是浮于表面的理解,只知道有局部性啊,会指令乱序,但从不知其原理。百度这篇文章让我醍醐灌顶,对cpu的理解更近了一个层次,而我自己的学习还任重而道远,成为一个优秀的程序员还有很长的路要走。。。原创 2022-12-16 13:17:21 · 266 阅读 · 0 评论 -
自底向上brpc(一):resource_pool
brpc的资源池实现还是比较容易理解的,与我曾经看过的资源池大同小异。我自己印象比较深刻的点,一是brpc非常看重locality,通过thread local来实现高效的资源分配,并通过一个全局的blockgroup来进行分发blcok,实现资源的合理调度。同时为了防止多线程下分发blcok导致的锁竞争导致的性能下降,采取了lock-free的实现方式。原创 2022-11-29 13:21:16 · 363 阅读 · 0 评论 -
基于c++20 coroutine实现对称协程
简单总结就是对于每一个coroutine函数,都会生成一个专属的类,这个类的成员变量就是这个函数栈上的所有变量,在通过我们提供的promise_type和await的原语对这个类做拓展。我在其中做的最关键的一步就是在init时进行了suspend,同时suspend时存下父函数的handle,在这个协程被挂起时,handle被保存到全局变量,函数链被依次挂起返回到最上层。当协程执行完结束时,调用final_suspend,这时会直接通过我们保存父函数的handle,来唤醒父函数,从而实现协程的对称概念。原创 2022-10-02 14:21:10 · 586 阅读 · 0 评论 -
C++链表的高级实现
在STL中list的底层的数据结构是链表,但是在很多c++开源项目中并没有使用STL中的list。原因是因为list中的node不是内嵌到数据结构当中的,这样就和链表的作用相违背。链表的最大作用是他是一个局部化的结构,一个结构体只需要持有链表中的其中一个节点,就可以对这个节点本身进行插入,删除等操作,新增的结构体也同样只持有新增的节点,便可以进行链表的操作,而不需要持有整个链表。然而std::list无法实现这个功能。这也是因为需要遵循STL中iterator的惯例,迭代器与数据是解耦的,但链表的lis原创 2021-02-05 17:16:24 · 214 阅读 · 0 评论 -
关于 ucontext 的源码阅读
之前有写过一个协程库,用的是libco的context_swap.s作为协程切换,为了了解与ucontext的区别,去读了源码进行了解。#include <sysdep.h>#include "ucontext_i.h"/* 这个函数的功能是获得当前协程(或者此时还不能称为协程)的上下文将他存入参数中 */ENTRY(__getcontext) /* 4(%esp)就是函...原创 2020-03-21 11:41:11 · 549 阅读 · 1 评论 -
STL空间配置器
学习了空间配置器,感觉这块内容很容易忘记,特做此笔记。概述STL的内存管理通过空间配置器来进行管理。//alloc为配置器template <class T, class Alloc=alloc>class vector {};SGI STL默认使用二级配置器,配置器中会根据不同的场景,决定是使用一级配置器还是二级配置器,下面我们依次介绍。一级配置器一级配置相对简单,...原创 2020-03-03 17:46:13 · 166 阅读 · 0 评论 -
内存对齐原则
虽然内存对齐之前一直都有了解,但让我总结我一直总结不出来,所以小结一下对成员变量进行对齐一个变量的相对首地址的偏移要为变量大小的倍数,如int变量偏移只能在0,4,8,12这些地址上。char的倍数为1所以可以在任意地址。对结构体整体进行对齐结构体的对齐值是其成员的最大对齐值。#pragma pack(n)编译器可以设置一个最大对齐值,怎么类型的实际对齐值是该类型的对齐值与默认对齐值取...原创 2020-03-02 15:20:10 · 137 阅读 · 0 评论 -
C++四种类型转换
static_cast(静态类型转换)子类转父类父类转子类(不保证正确)基本类型转换void*转其他类型其他类型转void*dynamic_cast(动态类型转换)dynamic_cast会在运行时期检查类型转换是否合法,有一定安全性,但因为是运行时检查,所以会损失性能。dynamic_cast只能转换引用或指针,在转换失败时会返回空指针,引用则抛出异常。我的理解,在向下转换...原创 2020-02-24 18:49:33 · 361 阅读 · 0 评论 -
单例模式总结
(以下全是线程安全)最简单的实现:加锁#include <iostream>#include <mutex>using namespace std;std::mutex mt;class Singleton{private: Singleton(){}public: static Singleton* instance() { ...原创 2020-02-24 16:37:13 · 196 阅读 · 0 评论