- 主题:gcc是不是symmetric transfer的支持有问题?
嗯。
要有协程锁,线程锁是锁不住的,都在一个线程里,谁也锁不住谁。
自己弄个软锁了,没有原子性,那个缝挺难办的。
在多线程协程,用线程锁保护软锁,软锁完成前不受别的线程打扰。而在一个线程里只有一个协程,就不会有多个协程互相打扰。
但是延长了切换时间,协程切换快的优势荡然无存,想切一次协程,得切好几次线程。
【 在 hgoldfish 的大作中提到: 】
: 没有临界区。但不代表没有锁啊。
: 锁是同步原型,当你涉及到两个变量的修改,中间存在协程阻塞的时候仍然是需要加锁的。
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
看了我俩讨论了吗?协程的使用,需要考虑那么多问题,各家的协程库,它们资源的使用条件和切换机制,都交代清楚了吗?理解透了吗?
【 在 allegro 的大作中提到: 】
: 自己写了一些带coroutine的for循环,发现stackoverflow。
: 怀疑是不是有symmetric transfer的问题,对着Lewis Baker的那篇博文比较,的确如此。
: 改成symmetric transfer的形式后,仍然crash,导致自我怀疑好几天。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
嗯。
c库基本协程工具不负责处理这个问题,得自己弄。
那么,c++协程库,有谁提供?
【 在 hgoldfish 的大作中提到: 】
: 有协程锁的。
: 你可以看看 python 都有实现。
:
--
FROM 221.218.60.*
这帖应该被设精。
【 在 allegro 的大作中提到: 】
: 看了,受益匪浅,谢谢!
: - 来自 水木社区APP v3.5.7
--
FROM 221.218.60.*
临界区问题,发生概率极低,需要在大规模压力(数百数千连接同时爆发)测试下长时间运行,才会零星闪现,所以调试了4个月。
现在告知了,大家再设计多线程协程系统,就不会再那么费力debug了。
另外只有大规模并发服务器才需要动态栈空间管理,一般有限个协程 ,静态空间管理即可。
【 在 ylh1969 的大作中提到: 】
: 动态栈空间管理,就是用mmap呀,定义好生命周期和资源投放回收,临界区(4个月的debug,就是处理临界区)处理这些,就没问题,已经投产使用啦。框架调好了,各种应用都没问题。
: 单线程协程没有临界区,简单多了。你不妨试试。
: 临界区就是一个任务还没有swap完成,另一个线程就拿到这个任务并企图处理它。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
libc的协程函数极简单 其实主要就是2个函数:
getcontext(),保存当前现场到ucontext。也用作初始化uc。
setcontext(),将ucontext设置成当前现场,常用作resume。
另外两个:
swapcontext(),=getcontext
+setcontext,常用作yield。
makecontext(),设置协程入口函数。
栈空间指针ucontext里边有,你自己配置。管理的好不好自己知道。
这么简单的协程工具,还需要找什么协程库!有那功夫(理解和debug)自己的工具早就写完了。
这部分有源码,不具备此功能的系统,用源码编译即可。
与异步io相结合,是你的事。
【 在 allegro 的大作中提到: 】
: 看了,受益匪浅,谢谢!
: - 来自 水木社区APP v3.5.7
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*