前言
libco是腾讯微信开源的C/C++实现的协程库,在微信后台有大规模应用。
在早期微信后台业务逻辑实现中,大量采用了多进程或多线程同步模型。随着业务量不断增大,同步模型的弊端日益显现,在这种场景下,业务系统数据处理能力及整理吞吐量往往非常低。
为了解决此类问题,后台业务系统必须进行大规模改造,改造的方式有两种:
- 线程异步化改造;
- 协程异步化改造;
前一种方式往往要求将现有系统中所有同步模型全部替换为异步模型,无异于将整个系统从框架层开始全部重写,风险显然比较高。而后一种方式,由于hook了socket API,因此将对老系统代码的侵入性降到了最低。
libco的项目背景及整体设计思想,可以参考《C/C++协程库libco:微信怎样漂亮地完成异步化改造》一文。
闭包源代码分析
libco中提供了一份简单的闭包实现,接下去会分段进行分析。
代码片段一:
#ifndef __CO_CLOSURE_H__
#define __CO_CLOSURE_H__
struct stCoClosure_t
{
public:
virtual void exec() = 0;
};
这段代码本质上定义了Closure的基类,闭包在调用时,最终会调用exec()函数。
代码片段二:
//1.base
//-- 1.1 comac_argc
#define comac_get_args_cnt( ... ) comac_arg_n( __VA_ARGS__ )
#define comac_arg_n( _0,_1,_2,_3,_4,_5,_6,_7,N,...) N
#define comac_args_seqs() 7,6,5,4,3,2,1,0
#define comac_join_1( x,y ) x##y
#define comac_argc( ... ) comac_get_args_cnt( 0,##__VA_ARGS__,comac_args_seqs() )
#define comac_join( x,y) comac_join_1( x,y )
上面定义的6个宏主要分为以下两类:
- comac_argc宏主要用于求出可变宏参数的个数。 注意:在这份实现中,最多支持7个宏参数求长度。