c++协程库libfiber之2:编译及例子

编译生成库

分别在代码根目录和示例代码目录下执行make命令即可编译生成静态库:

$cd libfiber
$make

由于libfiber同时支持c和c++ 接口,所以会默认生成两个静态库。如果需要动态库,需要在根目录下执行:

$ cd cpp
$ make shared rpath=xxx
$ cd ../c
$ make shared rpath=xxx

其中rpath是存放动态库的目录。

后面我主要关注c++ 的接口。c++ 的接口里实际上都是调用的c接口,真正的额实现在c里面,c++ 的接口只是封装了一层而已。

编译示例程序

示例代码在samples目录下,共4个目录。其中c下是c语言的例子,cpp下是c++ 的例子,cxx下是c++11 的例子,封装了类似golang里的go关键字,xcode是MacOS下的xcode工程。

4个目录下c语言的例子最齐全,其它3个比较简单。

$ ls samples/
c  cpp  cxx  xcode

编译示例程序:

$cd samples/cpp
$make

cpp目录下的client目录下是一个echo server的客户端,server目录下是一个echo server的服务端。client启动如果不传参数的话,默认在本机的8192端口上启动100个协程去写1万次(每次写完立即读回来)。
server则是监听在8192端口,每一个连接创建一个协程去处理。

并发性能对比

示例程序里echo server的client程序在执行完毕后会统计性能,我使用默认参数最后得出的结果如下:

total count=1000000, cost=33807.08, speed=29579.60

共100万次echo,时间33807毫秒,约半分钟,每毫秒近3万次echo。
我又测试了在client里只启动一个协程,然后经进行100万次echo,结果统计如下:

total count=1000000, cost=98446.83, speed=10157.77

可以看到性能下降到原来的1/3,时间用来原来的近3倍。

这里说一下,当只有一个协程的时候,基本相当于单线程,没办法用到协程并发的好处。这个测试起码说明,协程能大大提高并发的性能。

C++里使用协程的例子

实际上libfiber的头文件里注释相当详细,直接看头文件就可以。

我这里简单贴一下:

    acl::fiber* fb = new fiber_listen(fd);
	fb->start();

	acl::fiber::schedule_with(acl::FIBER_EVENT_T_KERNEL);

其中fiber_listen是继承自acl::fiber的一个自定义类,唯一必须实现的接口就是void run(void)。这个函数会被协程运行后回调,类似于线程的执行函数。

创建acl::fiber的实例后要调用它的start()成员函数,协程才能才会被调度。然后调用acl::fiber::schedule_with()真正开始调度协程。

我觉得这里可以把acl::fiber::schedule_with()理解成一个while(1)循环,当所有的协程都结束后该函数才会返回。

这里最重要的类就是acl::fiber了,理解它直接看头文件即可,里面的注释很详细。

如果协程的实例是new出来的,别忘了在run()的最后释放内存:

delete this;

c++11使用协程

在头文件go_fiber.hpp里,libfiber利用c++11的特性封装了几个类似golang语言的宏:

#define	go			acl::go_fiber()>
#define	go_stack(size)		acl::go_fiber(size)>

#define	go_wait_fiber		acl::go_fiber()< //新建协程执行指定的函数,并等待结束
#define	go_wait_thread		acl::go_fiber()<< //新建线程执行指定的函数,并等待结束
#define	go_wait			go_wait_thread

其中上面两个是创建一个协程(区别是是否带栈大小,默认为32000)。后面的三个功能类似于 std::async,启动一个异步的协程或线程去执行任务,本协程或线程会等待它执行结束。

例子:

    go[=] {
		fiber_listen(fd);
	};

	acl::fiber::schedule_with(acl::FIBER_EVENT_T_KERNEL);

这段代码功能和上面c++ 的版本是一样的,但是更简洁, 不必封装自己的子类,使用起来更方便。只要支持C++11 就可以。

参考资料

我的前一篇博客:c++协程库libfiber之1:简单介绍

libfiber的源码工程主页

libfiber的贡献者爱奇艺的技术分享:爱奇艺网络协程编写高并发应用实践

ACL作者介绍libfiber的博客:acl开发–协程篇

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值