编译生成库
分别在代码根目录和示例代码目录下执行make命令即可编译生成静态库:
1
2
3$cd libfiber $make
由于libfiber同时支持c和c++ 接口,所以会默认生成两个静态库。如果需要动态库,需要在根目录下执行:
1
2
3
4
5$ 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个比较简单。
1
2
3$ ls samples/ c cpp cxx xcode
编译示例程序:
1
2
3$cd samples/cpp $make
cpp目录下的client目录下是一个echo server的客户端,server目录下是一个echo server的服务端。client启动如果不传参数的话,默认在本机的8192端口上启动100个协程去写1万次(每次写完立即读回来)。
server则是监听在8192端口,每一个连接创建一个协程去处理。
并发性能对比
示例程序里echo server的client程序在执行完毕后会统计性能,我使用默认参数最后得出的结果如下:
1
2total count=1000000, cost=33807.08, speed=29579.60
共100万次echo,时间33807毫秒,约半分钟,每毫秒近3万次echo。
我又测试了在client里只启动一个协程,然后经进行100万次echo,结果统计如下:
1
2total count=1000000, cost=98446.83, speed=10157.77
可以看到性能下降到原来的1/3,时间用来原来的近3倍。
这里说一下,当只有一个协程的时候,基本相当于单线程,没办法用到协程并发的好处。这个测试起码说明,协程能大大提高并发的性能。
C++里使用协程的例子
实际上libfiber的头文件里注释相当详细,直接看头文件就可以。
我这里简单贴一下:
1
2
3
4
5acl::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()的最后释放内存:
1
2delete this;
c++11使用协程
在头文件go_fiber.hpp里,libfiber利用c++11的特性封装了几个类似golang语言的宏:
1
2
3
4
5
6
7#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,启动一个异步的协程或线程去执行任务,本协程或线程会等待它执行结束。
例子:
1
2
3
4
5
6go[=] { 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内容请搜索靠谱客的其他文章。
发表评论 取消回复