模板线程安全单例C++版本与pthread_once

工作以后单例确实经常用到,复习的时候再次翻开偶然翻到这个 代码来自陈硕的《Linux多线程服务器编程》, 其核心就是用了pthread_once template class Singleton: boost::noncopyable { public: static T& instance() { pthread_once(&ponce_, &Singleton::init); return *value_; } private: Singleton(); ~Singleton(); static void init() { value_ = new T(); } private: static pthread_once_t ponce_; static T* value_; } template pthread_once_t Singleton::ponce_ = PTHREAD_ONCE_INIT;

Python Logging源码解析

前言 python的logging是python内置打印模块,近期因为需要解决框架里的日志耗时长的问题,所以拜读了一下源码,其基础功能的实现源码并不长,截至今日11.15日,python3.8的logging/init.py 大概有4000+行,再算上一些内置方便的handler与config的话,大概会有6000行,总体来说并不是很多。 basicConfig basicConfig是快速且简单配置 root logger 的函数,在一个进程中,默认情况下,这个函数它只会生效一次。因为它有如下判断 if len(root.handlers) == 0: pass 后来这个只生效一次为人所诟病,就又加了一个force参数,能够对其强制更新。 下面说明一下所有参数 参数名称 参数描述 force 强制更新 filename 日志输出到文件的文件名 format 日志输出的格式 datefat 日志附带日期时间的格式 style 格式占位符,默认为 "%" 和 “{}” level…

RapidJSON源码剖析

前言 RapidJSON是腾讯开发的一个开源json解析代码库,因为在公司里经常用到,并且总是会踩坑,因此我这里也开个坑用来记录我对RapidJSON的学习与理解。 学习一个json库,我们关注的无非有以下几点: 1. json如何存储 2. json如何解析与反解析 而选择使用一个json库,我们关注的则是以下几点: 1. 安全性 2. 运行效率 3. 易用性 下面我会按照以上几点一一展开 json存储 关于其存储结构,就我而言第一个想法肯定是直接先构造一个支持增删改查的树,再将这个树运用在json存储中。但其实相当意外的,因为json使用时候的特殊性,其存储结构只要线性(伪)即可。 // AddMember GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { RAPIDJSON_ASSERT(IsObject()); RAPIDJSON_ASSERT(name.IsString());…

康健计划——内联汇编

内联汇编只能使用AT&T汇编,以前先学的是Intel汇编,更熟悉的也是这个,AT&T汇编也是忘的差不多了。。 Intel汇编与AT&T汇编的区别 区别 intel AT&T 寄存器 寄存器前无前缀 寄存器前有前缀 % 操作数顺序 目的操作数在左,源操作数在右 目的操作数在右,源操作数在左 操作数指定大小 操作数前加修饰符,byte表示8位,word表示16位,dword表示32位 在指令后加字母表示,b表示8位,w表示16位,l表示32位 立即数 无前缀,直接用数字表示 有前缀$ 远跳转 jmp far segment:offset ljmp %segment: %offset 远调用 call far segment:offset lcall %segment: %offset 远返回…

Tornado 异步源码解析

前言 tornado在我工作前说实话我还没有听说过,今年回来后接触的非常多。 关于想要学习异步的内容,起因是如下场景: tornado拿到请求后,对他的处理时间非常的长,一般大概有10s,晨旭让我把他写成异步的,如果只是对请求异步的是相当好写的。就是十分传统地在收到请求后立即返回,然后进行处理,处理了之后再返回给给定的callback_url。 但我突然想到,能否对这整个处理进行异步,将其放到后台运行,然后继续接收请求不至于在请求上堵塞。 最后是没实现出来……坤爷让我去花时间了解一下tornado所著名的异步。于是我才发现,我这想法在tornado的异步中是不可行的。(而且错误的地方还蛮多的…… 异步使用方式 from tornado import gen @gen.coroutine def fetch_coroutine(url): http_client = AsyncHTTPClient() response = yield http_client.fetch(url) raise gen.Return(response.bo…

iota - Go中优雅的常量

常量计数器 iota 其实可以对标 C++ 中的枚举,但显然 iota 比枚举更加优雅且更加友好。 iota 是一个常量计数器,(注意它的对象必须是个常量),当你给一个常量赋值为 iota 时,从当前行开始,随着逐行往下,iota也会逐渐 +1 。 举个例子 const ( v1 = iota v2 v3 ... ) 上面代码的结果是 v1 = 0, v2 = 1, v3 = 2 支持表达式 iota支持表达式,比如我在赋值的时候给的是 v1 = 11 * iota 那么 v1 = 0, v2 = 11, v3 = 22,以此类推 支持跳过 iota支持跳过某一个值,你只需要在这一行的常量写为 _ 即可。 支持自定义和重新定义…

锐捷multi-NIC问题频繁断网解决

本校校园网用的是锐捷,在linux中的使用方法是 sudo rjsupplicant.sh -a 1 -d 1 -s wireless -u username -p password 然而有时候会频繁出现断网情况,这个情况不止出现于linux,而在windows下反而更难搞 如图 其实稍微会点英语的的话,自己读一下,它的意思就是说,“本机使用了多网卡,请把未认证的网卡关闭,再重新认证” ok,就是只要关一下网卡就好了,网卡的话,一般用 ifconfig 就好了。单纯使用 ifconfig 查看开启的网卡: 之后调用ifconfig 关闭,关于关闭的网卡的话,在使用锐捷时它显示的Adapter那个是要保留的,其他关闭即可。 sudo ifconfig wlp4s0 down sudo ifconfig lo down 最后重新认证一下就可以了。 然而一直这样的话还是会有点麻烦,你也可以在…