码迷,mamicode.com
首页 > 其他好文 > 详细

协程-浅谈2

时间:2016-10-14 20:39:00      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:

  上篇讲了后台开发用协程的好处、优势。这里讲下目前本人知道的一点协程的实现方法。

参考了:

 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

标签:

原文地址:http://www.cnblogs.com/baozimeiyouxian/p/5961024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!