S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2014.04.18.Coroutines 的坑

Posted on 2014-04-17 16:21 S.l.e!ep.¢% 阅读(1710) 评论(0)  编辑 收藏 引用 所属分类: C++
最近的程序莫名奇妙的coredump,  挂的方式和地方都不一样, 后来怀疑是 协程的堆栈溢出了.
makecontext() 传入的第一个参数 ucontext_t* 其中的成员 uc_stack.ss_size 需要指定堆栈的大小, 改了下大小, 就不会挂了

谷歌了下,发现也有人遇到同样的坑,解决方法也是
1. 避免使用栈
2. 增大协程栈的大小
原文: 协程框架的堆栈大小陷阱

检查下了unix下的线程堆栈大小
linux-7r0r:~ # ulimit -a | grep stack
stack size              (kbytes, -s) 8192

发现只有8M?

谷歌了半天,没有找到答案的两个问题
1. 协程堆栈现在我定义了20M, 但随着程序逻辑的复杂性增加, 可能也会溢出, 只是早晚的问题
2. 如何去保护这个协程堆栈, 发现异常时, 可以及时发现, 甚至可以 try - catch 
   -- 网上已经有人用mprotect做了堆栈保护, http://www.gaccob.com/?p=1254 

看到 GNU有个 pth 也封装了协程 http://www.gnu.org/software/pth/
.. but 代码没看懂它是如何调用 makecontext 的, 先 make down

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理