2014.04.18.Coroutines 的坑

最近的程序莫名奇妙的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

你可能感兴趣的:(2014.04.18.Coroutines 的坑)