
c++
sai_j
这个作者很懒,什么都没留下…
展开
-
bprc-bthread梳理
BRPC是baidu内部自研的一套RPC框架,除了易用性、高性能之外,核心的一个亮点就是当中完整实现了一套M->N的Green Threading(类似Golang的Goroutine)。1)BRPC在公司内部大量使用,每天的工作基本上都绕着brpc转也不为过;2)因为自己最早是写C出身的,自然对Golang喜欢的不行,Goroutine也用得不要太开心,但是一直没有对Goroutine的原理进行学习。借此机会,希望通过对bthread的梳理,能管中窥豹M->N Green Threadi原创 2020-10-01 13:09:14 · 603 阅读 · 0 评论 -
[C++11] 循环引用
前言虽然C++11中的智能指针,一定程度上简化了C++当中的内存管理;但是,shared_ptr<>的使用同时也引出了另一个问题:循环引用。例子让我们先来看一段示例代码。#include <iostream>#include <vector>#include <memory>using namespace std;class pa...原创 2018-09-30 13:01:52 · 7306 阅读 · 0 评论 -
[N周N语言] Golang for range,C++ auto for 遍历时是否可以删除元素?
先说下结论Golang中的map,是可以在for range时删除元素的;但是,不能取元素的地址;C++中的auto for,则是不支持删除元素的;原创 2018-10-06 20:48:10 · 1211 阅读 · 0 评论 -
[C++采坑实录] Lambda按值捕获 和 array
背景 一个学环境的朋友,正准备转码农,今天碰巧遇到一个Bug。这里,我把代码简化之后,来看看到底哪里出现了问题? 代码int main() { int collection[5] = {}; auto process = [=]() { // 按值捕获 for(int i : collection) std:...原创 2018-10-12 23:44:59 · 2127 阅读 · 7 评论 -
[STL] lower_bound和upper_bound实现
int lower_bound(vector<int>& nums, int target) { int lo = 0, hi = nums.size() - 1; while (lo <= hi) { // equal int mid = lo + (hi - lo) / 2; ...原创 2018-10-05 15:45:22 · 2005 阅读 · 0 评论 -
[C++] 如何声明一个同迭代器指向元素类型相同的变量?
Q假设算法中要声明一个变量,以"迭代器所指对象的类型”为类型,该怎么办?A1. C++11 auto在C++11当中,可以直接用auto关键词进行声明;auto var = *iter;2. function template的参数推导如果编译器不支持C++11,或者说我想知道auto背后的原理呢?这时候,就需要用上函数模板的参数推导了。template&lt;typename ...原创 2018-09-21 22:45:40 · 617 阅读 · 0 评论 -
[LevelDB] 一步步剖析AtomicPointer
AtomicPointer是LevelDB中的一个基础数据结构,其核心代码只有寥寥10来行。但是,为了理解这10来行代码,却需要十分扎实的CPU架构、操作系统、编译器、C++11知识。为了搞明白其背后的原理,同时加深理解,我准备从以下几点着手,一步步抽丝剥茧:什么是乱序执行? 什么是Memory Barrier ? Platform-Specific的AtomicPointer实...原创 2019-03-04 00:32:10 · 405 阅读 · 0 评论 -
[C++11] 万能引用总结
针对左值,万能引用等效左值引用;针对右值,万能引用等效右值引用; 针对左/右值,万能引用都正确进行了推导,那为啥还要有std::forward? 因为右值引用是左值!!万恶之源 有点绕,为啥右值引用是左值? 右值,就是“无名”的value,只有值,没有变量名; 右值引用,本身就是一个变量,当然是左值; 右值引用在绑定了右值后,为右值增加了一个“句柄”,这样看也当然是左值...原创 2019-01-14 21:15:50 · 2235 阅读 · 0 评论 -
[N周N语言] C++实现Golang中的WaitGroup
class WaitGroup {public: void Add(int incr = 1) { counter += incr; } void Done() { counter--; if (counter <= 0) cond.notify_all(); } void ...原创 2018-10-10 22:15:05 · 654 阅读 · 0 评论 -
[C++11] 线程安全的BoundedBlockingQueue
template <typename T>class BoundedBlockingQueue {public: explicit BoundedBlockingQueue(int maxSize) : ringbuffer(maxSize) { } void put(const T& x) { std::unique_lock&...原创 2020-10-05 02:14:09 · 991 阅读 · 0 评论 -
[C++11] 线程安全的BlockingQueue
参照muduo中的源码,使用C++11语法进行改写#include <mutex>#include <condition_variable>#include <deque>template <typename T>class BlockingQueue {public: BlockingQueue() : mutex_(), c...原创 2018-10-10 21:07:43 · 1051 阅读 · 0 评论 -
[C++11] ThreadPool
背景近期,在造一个异步HTTP调用的轮子;https://github.com/Sai-Jiang简单来说,通过一个Restful接口,代理会接收异步HTTP调用的请求;这些接收到的异步HTTP调用请求,将会由代理代为去执行;适用的场景,主要是低时延接口调用高时延接口;HTTP的调用,目前准备用线程池来做;线程池实现中的任务队列,我就直接复用了之前博客中的BoundedBl...原创 2018-10-16 23:51:23 · 592 阅读 · 0 评论 -
[C++] 适用程序退出的Signal Handler
To the point#include <csignal>#include <glog/logging.h>#include <mutex>#include <condition_variable>class SignalHandler {public: SignalHandler() = delete; st...原创 2018-10-16 16:17:58 · 2348 阅读 · 0 评论 -
[C++] lock_guard vs unique_lock
Lock doesn’t have to taken right at the construction, you can pass the flag std::defer_lock during its construction to keep the mutex unlocked during construction.std::unique_lock<std::mutex>...原创 2018-10-01 02:27:37 · 361 阅读 · 0 评论 -
[STL] vector会自动shrink嘛?
Q(头脑风暴)vector是最常用的STL容器;同时,vector的底层实现会自动处理underlying storage用完的情况,进行扩增。但是,当我们clear()或者erase()掉vector中的部分元素后,vector的underlying storage会自动shrink嘛?A答案是No,std::vector::shrink_to_fit()...原创 2018-09-24 11:20:42 · 1195 阅读 · 0 评论 -
[C++11] 线程安全的单例Singleton
饿汉模式class Singleton {public: static Singleton &amp;amp;amp;GetInstance() { static Singleton instance; return instance; }private: Singleton() = default; Singleton(const Singl...原创 2018-09-19 00:08:38 · 303 阅读 · 0 评论 -
[C++] 菱形继承
这里,我们要讨论下虚基类成员的可见性。理论基础假定类B定义了一个名为x的成员,D1和D2都是从B 虚继承 得到的,D继承了D1和D2,则通过D的对象使用x,有三种可能性:如果在D1和D2中都没有x的定义,则x将被解析为B的成员,此时不存在二义性,一个D的对象只含有x的一个实例;如果D1或D2中某一个成员定义了x,则同样没有二义性,派生类的x比虚基类中的x优先级更高;如果D1和...原创 2018-03-12 17:15:38 · 151 阅读 · 0 评论 -
[C++] 一段代码搞清楚C++ 3种继承
class A {public: int x;protected: int y;private: int z;};class B : public A { // x is public // y is protected // z is not accessible from B};class C : protected A { ...转载 2018-03-09 21:45:39 · 277 阅读 · 0 评论 -
[Effective C++] Rule 32: Make sure public inheritance models "is-a"
公开继承(public inheritance)意味着“is-a”的关系。如果class Derived以public形式继承class Base,每一个类型为Derived的对象同时也是一个类型为Base的对象;Derived表现出更特殊化、具体化的概念,而B表现出更一般化、泛化的概念;Base对象可以派上场的地方,Derived对象一样可以派上用场;...原创 2018-03-07 11:11:58 · 1033 阅读 · 0 评论 -
[Effective C++] Rules 16: Use the same form in corresponding uses of new and delete
当使用new时:分配内存;针对此内存,调用一个(或多个)构造函数;当使用delete时:针对此内存,调用一个(或多个)析构函数;释放内存;这个问题,已经老生常谈了。简单来说就是,* new与delete成功使用,new []与delete []成对使用。 * 当然,有时候可能并非如此直观,举个例子typedef string MultiStr[4];s...原创 2018-03-07 10:36:43 · 214 阅读 · 0 评论 -
[Effective C++] Rules 17: Store newed objects in smart pointers in standalone statements
void process(shared_ptr<int> pi, int priority) { }process(new int(42), getprior()); // error // shared_ptr<T>的构造函数为explicit, ...原创 2018-03-07 10:23:49 · 194 阅读 · 0 评论 -
[Effective C++] Rules 13: Use objects to manage resources
除去class、template等,C与C++明显不同的一点就是对于资源的管理方式。C++也支持传统C语言那种风格的手动资源资源管理方式。但是,很明显这种原始方式对于C++而言,有些力不从心。下面是比较典型的C-like资源管理方式,但是,如果在资源获取和释放之间发生了exception会怎么样?很明显,资源释放操作就可能被跳过。你可能会说,我们可以catch exceptio...原创 2018-03-06 20:09:04 · 247 阅读 · 0 评论 -
[C++] typedef typename ?
typedef typename std::list<T*>::iterator ItemPtr; std::list<T*>::iterator这玩意理论上可能是 静态数据成员、 静态成员函数、 者嵌套类型、 在模板类型实例化之前谁也不知道。typename的作用,就是指出这东西是个嵌套类型原创 2017-11-29 20:48:26 · 195 阅读 · 0 评论 -
[Effective C++] 尽量以const、enum、inline替换#define
使用#define的几种典型场景:定义常量;实现宏函数;使用#define定义常量的问题在于:在经过预处理器后替换后,每个常量都变成了孤零零的值,增加了调试难度以及二进制体积;#define定义的常量缺乏作用域的概念,无法实现class常量这一概念;针对第一点,我们只需要将往常的#define定义式改写成const即可。比如说将#define ASPECT_...原创 2018-03-05 18:00:09 · 194 阅读 · 0 评论 -
[Itanium C++ ABI] 成员指针
数据成员指针对于普通指针变量来说,其值是它所指向的地址,0表示空指针; 对于数据成员指针变量来说,其值是数据成员相对于对象起始地址的偏移,空指针用-1表示;struct X { int a; int b;};#define VALUE_OF_PTR(p) (*(long*)&amp;amp;amp;p)int main() { int X::*p = 0; ...转载 2018-08-07 23:17:54 · 873 阅读 · 0 评论 -
[C/C++] volatile关键词
Volatile关键字Volatile关键词的第一个特性:易变性。所谓的易变性,在汇编层面反映出来,就是两条语句,下一条语句不会直接使用上一条语句中volatile变量的寄存器内容,而是重新从内存中读取。Volatile关键词的第二个特性:“不可优化”特性。volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,保证程序员写在代码中的指令,一定会被执行。...原创 2018-09-16 18:42:42 · 164 阅读 · 0 评论 -
[evpp/muduo/reactor] evpp事件驱动网络库 整体架构梳理 2
序上一篇博文中,我们从用户使用的角度入手,对evpp中TCPServer、TCPClient两大类进行了梳理。接下来,我们再来分析梳理下Listener、Connector两个类的细节。当然,这让我联想起了杨宗纬的那首歌“如果你愿意一层一层一层地剥开我的心,你会发现 你会讶异…”。扯得有点远,让我们进入正题。ListenerListener正如其名,主要是封装和TCPServer ...原创 2018-09-06 17:15:19 · 1383 阅读 · 0 评论 -
[C++] LRU实现
template &lt;typename Key, typename Val&gt;class LRUCache {public: LRUCache(int cache_size_) : cache_size(cache_size_) { }; void put(const int &amp;key, const int &amp;val) { auto i...原创 2018-09-05 11:12:57 · 547 阅读 · 0 评论 -
[evpp/muduo/reactor] evpp事件驱动网络库 整体架构梳理
介绍muduo很多人都听说过,那evpp可以理解成是muduo用C++11改写后的升级版。 相比muduo的代码风格,evpp会显得更加现代一点,更讨我们年轻人的喜欢。 作为例子,这里是一段TCP Echo Server的示例代码: std::string addr = &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;0.0.0.0:9099&amp;amp;amp;amp;amp;amp;amp;amp;amp;原创 2018-09-03 01:06:16 · 3068 阅读 · 2 评论 -
[STL] SGI STL红黑树实现的边界条件
背景SGI STL红黑树实现上的特殊点,在于红黑树有一个header辅助节点; - 该header的父节点为root节点; - 其左节点为当前二叉树中的最小值(最左); - 其右节点为当前二叉树中的最大值(最右); - 该节点本身就正好用来当做end迭代器;其初始化代码如下:void init() { header = new Node(); hea...原创 2018-09-02 14:52:59 · 286 阅读 · 0 评论 -
[C++] std::enable_shared_from_this
如图:原创 2018-08-30 00:10:21 · 238 阅读 · 0 评论 -
[Reactor] 如果不限制并发连接数可能会引发的问题?
对于reactor模式,listening socket是一种特殊的IO对象。当有新连接到来时,此socket变为可读,epoll_wait会返回这一事件,然后在事件处理器中调用accept获得新连接的socket,但是如果本机的file descriptor已经用尽,则accept会返回EMFILE,标志accept调用失败,新连接依旧在listen的连接池中没有取出来。既然没有socket文件...原创 2018-08-31 13:09:03 · 554 阅读 · 0 评论