首页 > 代码库 > 协程-浅谈2
协程-浅谈2
上篇讲了后台开发用协程的好处、优势。这里讲下目前本人知道的一点协程的实现方法。
参考了:
http://blog.csdn.net/qq910894904/article/details/41911175
http://www.cnblogs.com/Pony279/p/3903048.html
stack_full 协程的几种实现方式
1、glibc 的 ucontext 接口, getcontext(),setcontext(),makecontext(),swapcontext()
2、汇编: 可以参考linux内核中setjmp ,longjmp的代码。 保存寄存器,恢复寄存器,还要有个接口replace_esp 把ebp/esp栈地址寄存器指针换为自己分配的空间
3、boost库的boost_context ,或者 boost_coroutine ==PS没有研究过这个boost库的实现,可能其内部也是用的上面2种方法。
4、前面两篇文章中提到的 setjmp,longjmp + static local 的变量来保存协程内部的数据, 没有用过,不知道其正确性,个人感觉不可行,至少感觉实用性不强,
5、前面文章中提到的: setjmp,longjmp + linux pthread库 ,使用线程的栈作协程的栈,只能说这是个人的奇淫技巧, 创建一个协程,还要创建一个真正的线程,开销很大。
一些开源的协程库(c/c++的):
libgo : github.com/yyzybb537/libgo 魅族的
libco : http://code.tencent.com/libco.html 腾讯-微信后台
libtask : github.com/jamwt/libtask 好像作者是go语言的开发者
state-threads http://state-threads.sourceforge.net/
了解了协程的原理,实现个简单的协程吧。。 本人最近也实现了个,其实还是有很多坑的,github如下:
https://github.com/smallHW89/mico_thread
协程-浅谈2