概述
编译生成库
分别在代码根目录和示例代码目录下执行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开发–协程篇
最后
以上就是贪玩跳跳糖为你收集整理的c++协程库libfiber之2:编译及例子的全部内容,希望文章能够帮你解决c++协程库libfiber之2:编译及例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复