libco源代码分析(01) -- Closure源代码分析

前言

libco是腾讯微信开源的C/C++实现的协程库,在微信后台有大规模应用。

在早期微信后台业务逻辑实现中,大量采用了多进程或多线程同步模型。随着业务量不断增大,同步模型的弊端日益显现,在这种场景下,业务系统数据处理能力及整理吞吐量往往非常低。

为了解决此类问题,后台业务系统必须进行大规模改造,改造的方式有两种:

  1.  线程异步化改造;
  2.  协程异步化改造;

前一种方式往往要求将现有系统中所有同步模型全部替换为异步模型,无异于将整个系统从框架层开始全部重写,风险显然比较高。而后一种方式,由于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个宏主要分为以下两类:

  1. comac_argc宏主要用于求出可变宏参数的个数。 注意:在这份实现中,最多支持7个宏参数求长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值