首页 > 代码库 > 协程-浅谈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