setjmp的使用

以前对于C语言的setjmp和longjmp从来都是知道有这么个函数, 但是不知道什么情况下要使用, 甚至于不知道setjmp的实现机制是什么样子的. 这次在实现coroutine的过程中虽然没有使用setjmp来实现, 但是由于setjmp来实现coroutine的所有操作都是可以在用户态进行的, 因此顺便研究了一下setjmp的实现机制. 与我猜测大致一样, 在call stack上来讲setjmp一定先于或等于longjmp处于的位置, 这样其实longjmp所做的不过就是将当前寄存器上下文恢复成setjmp函数保存的值即可. 调用longjmp的函数……

实现了一个coroutine

在学习了lua之后, 总算是搞清楚了颇为流传的coroutine是怎么回事. 我发现coroutine就是我一直希望使用的那种多任务处理方式, 即有线程的清晰抽象, 又可以避免锁带来的开销以及其他并发问题, 可以说是线程和异步处理的一个最佳折中点. 在大约一年前, 我一直在为不能控制多线程的调度而苦恼(那里还不知道在Windows下Sleep(0)可以暂时让出cpu的控制权), 我甚至试图使用状态机来模拟多线程以便我可以控制线程调度, 后来因为这个方法对于代码的可维护性来讲付出的代价太大, 最终没敢使用.……