协程
文章平均质量分 84
对不起我是一个厨子
Others tell you how ,I tell you why,,,,,,
展开
-
一个C/C++协程库的思考与实现之协程库的正常退出
https://github.com/DoasIsay/ToyCoroutine我发现协程只能在对端主动断开连接后才能被动退出,并不能主动退出,做为服务端其实不应当主动断开连接退出,你不知道客户端还有没有数据要发,及客户端的发送缓冲区还有没有数据未发完,如果客户端没有在应用层实现ack及重试机制就有可能导致数据丢失,但协程不一定要只用在服务端思来想去,我还是想,像在多线程,多进程编程环境中那样,在代码中设一全局变量isExit,当 kill进程时,在信号处理函数中设isExit为true时,进程可以原创 2020-08-26 23:14:34 · 42 阅读 · 0 评论 -
一个C/C++协程库的思考与实现之协程栈的动态按需增长
https://github.com/DoasIsay/ToyCoroutine对于操作系统的任务(进程或线程)而言,任务所需的栈内存,堆内存,并不是任务启动后或发起内存申请(brk/mmap/malloc/new)后操作系统立即为其分配物理内存,而是先为其在进程的虚拟地址空间中找到一块空闲的空间标记其大小起止地址及访问权限,当CPU真正访问到任务未分配物理内存的虚拟页内的地址时MMU会产生一个内存缺页中断,此时在缺页中断处理中操作系统才会真正的为任务分配一页物理内存并更新进程的页表如何检测协程是否原创 2020-08-25 21:16:35 · 623 阅读 · 1 评论 -
一个C/C++协程库的思考与实现之协程的errno与信号处理
https://github.com/DoasIsay/ToyCoroutine每个线程都有自己的errno,那么协程是否也需要自已的errno?如果这样写代码,那每个协程要有自已的errno在hook的系统调用中当io读写不能满足时,就进行协程切换,在io可读写返回到用户代码后继续使用errno,此时的errno可能已经不是协程切换前的errno了,因为期间其它协程也会call系统调用,所以因在hook系统调用的代码中,在协程切换前先保存errno的值,因为协程恢复后会先判..原创 2020-08-24 21:49:37 · 294 阅读 · 1 评论 -
一个C/C++协程库的思考与实现之协程的跨线程负载均衡调度
https://github.com/DoasIsay/ToyCoroutine其实一开始我并不想让ToyCoroutine支持多线程,多进程SO_REUSEADDR其实也挺好的,大家各跑各的互不影响,但在写代码时我又时刻考虑到多线程,毕竟,没有多线程间的同步协作那该是多么的无聊啊,,,我在想当在多线程环境中使用协程库时,比如在一台8核的机器上,创建7个线程(调度器线程),每个线程负责一部分协程的调度执行,如何避免一些线程很忙导致协程调度超时,另一些线程却很空闲处于无协程可调度执行的状态?把忙的原创 2020-08-23 09:33:37 · 751 阅读 · 1 评论 -
一个C/C++协程库的思考与实现之协程的互斥量与条件变量
https://github.com/DoasIsay/ToyCoroutine在为ToyCoroutine的协程实现互斥量与条件变量时,测试过程中竟然死锁了,代码如下我怀疑是producer,consumer使用了同一个条件变量进行协作导致的,测试时刚好创建了2个consumer协程,1个producer协程,当consumer1协程与producer协程都cond.wait在同一个条件变量时,由于调度原因consumer2调用cond.signal如果每次唤醒的都是consumer1,在最后原创 2020-08-11 21:48:13 · 519 阅读 · 1 评论 -
一个C/C++协程库的思考与实现之栈溢出检测
事情是这样的,在第一次因协程栈溢出导致的进程崩溃后,过了不知道多久由于代码量的增加,协程的栈又溢出了程序又崩溃了,多线程加协程对使用gdb调试而言并不是很友好,可能我还是不会使用gdb吧,从coredump中基本上找不到什么有助于问题定位的信息,有时候连个函数调用栈都没有,你都不知道运行到那个函数那行代码时出现了问题,如果是刚刚修改了代码程序就崩了,还可以大概确定是修改了的这部分代码出了问题,但是如果修改了很多代码,就需要大海捞针一样,用最原始的调试手段,在每个你觉得可疑的地方去print碰运气于是我决原创 2020-07-16 22:38:53 · 995 阅读 · 1 评论 -
一个C/C++协程库的思考与实现之协程的简单调度
提供这样的协程使用接口,实在令人,,,0.0.1代码的accept协程只能写的这样丑陋,因为协程创建后立马调度执行占用了CPU,只有当协程读写网络IO将被阻塞时才会主动让出CPU,这时调度器会获得CPU,当有新连接到来时accept协程才会被调度器调度恢复执行,所以要在新创建一个协程前要先保存accept协程的上下文环境做为一个返回点,以便将来返回对于这么丑陋的代码我耿耿于怀,事实是我写代码的水平也确实不怎么样,确实丑陋但我还是想写出像创建多线程那样的代码,比如这样要写出..原创 2020-06-25 23:09:07 · 708 阅读 · 1 评论