A collection of 10 posts

MAC下使用GDB调试redis

因为在看redis源码,调试的时候一直出问题,所以记录一下踩过的坑。 权限不足,或者启动后卡住 提示: Unable to find Mach task port for process-id 43536: (os/kern) failure (0x5). (please ...

volatile内存模型

Java中的volatile CPU的读写操作 CPU在cache line状态的转化期间是阻塞的,经过长时间的优化,在寄存器和L1缓存之间添加了LoadBuffer、StoreBuffer来降低阻塞时间,LoadBuffer、StoreBuffer,合称排序缓冲(Memoryordering Buffers (MOB)),Load缓冲64长度,store缓冲36长度,Buffer与L1进行数据传输时,CPU无须等待。 CPU执行load读数据时,把读请求放到LoadBuffer,这样就不用等待其它CPU响应, ...

TF-Serving源码分析—模型加载部分

背景 因为要加一个检测模型加载是否成功的接口,需要读取TF-Serving中保存的加载到内存的model_config_file。 一开始在ServerCore里面加一个函数getConfig(),加锁访问该类中的config_,该变量保存了模型配置。 Status ServerCore::getConfig(std::unordered_map<string, string>* config_map) ...

GUARDED_BY —— clang的线程安全分析模块 thread safety analysis

通过代码注解(annotations )告诉编译器哪些成员变量和成员函数是受哪个 mutex 保护,这样如果忘记了加锁,编译器会给警告。因为在后续维护别人的代码时候,往往不像原作者那样深刻理解设计意图,特别容易遗漏线程安全的假设。 Thread Safety Annotations 可以方便阅读代码,而且在编译的时候会检查锁的状态。 其工作原理非常类似于多线程程序的类型系统。除了声明数据类型之外,还可以声明在多线程环境中如何控制对该数据的访问。比如如果foo遍历被互斥锁mu保护,那么只要有一段代码在没有先锁定mu的情况下读取或写入foo, ...

const在变量前后的含义

const int * p1=&me;//p1可变,p1不可变,此时不能用p1来修改,但是p1可以转向 int * const p2=&me;//p2不可变,p2可变,此时允许p2来修改其值,但是p2不能转向。 const int ...

C++的std::optional

解决函数多个返回值 为了解决C++函数返回多个值的问题,以前的做法通常是把返回指的指针作为入参传入,用函数的返回值作为运行状态的标识,比如下面这段,把指针output传入: #include <iostream> using namespace std; int func(const string& str, ...

条件变量pthread_cond_t

条件变量是什么 条件变量是线程同步的一种手段,用于阻塞线程直到条件发生。 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个/多个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"信号。 代码示例: #include <pthread. ...

C++性能优化的一些tips

存储数据从unordered_map换成vector,vector是连续内存存储,前者获取数据需要大概300ns,后者100ns。怎么解决key的问题:在一个配置文件中填写unordered_map中的key的顺序,按照顺序把数据插入vector; vector使用emplace_back不用pull_back,前者是原地构造。 std::future多线程; 如果每次请求都需要很多同样类型的数据A(比如预估方法中,每次请求都需要抽取一堆feature),那么可以在程序启动的时候提前申请很多(比如一万个) ...

C++反射的一种实现——可变参数模板

C++反射的实现需要解决的核心问题是怎么保持一个存储了类名到构造函数的方法。在上一篇我使用了宏定义在服务启动的时候注册,但是使用宏的方法避免不了每次创建类的时候都需要写一段宏去注册,那有没有什么办法可以绕过它呢?本篇文章使用可变参数模板,结合static变量在程序开始运行时创建而在程序结束时销毁,并且不依赖于对象的存在的特性。 创建一个单例工厂类,维护一个map。针对一个Class,定义一个注册类RegClass(可以使用可变参数模板来把所有类的注册类归为一个,这样一种类型的类只需要一个工厂),在注册类的构造函数中注册此类。定义一个类的时候,继承动态注册类,并传入子类作为参数模板:class **MyClass* ...

C++反射的一种实现方式——使用宏定义

C++中没有java和C#等各种语言中支持的反射,但是我们可以使用各种方式来实现一个伪的反射,中心思想是持有一个全局的注册map(类名->构造函数)。创建对象的时候,传入类名,然后在其中找到构造函数,然后创建对象。 本篇文章使用宏定义来解决注册的问题。 一、注册辅助类 ClassRegistry:模板函数,用于data、module、contextdata的注册, ...