- 主题:gcc是不是symmetric transfer的支持有问题?
嗯。没错,只管栈的。这本来也没问题。ucontext 当然是没问题的,不然早就从 POSIX API 里面删掉了。
c++20 则是把内存申请在堆里面。这就是为啥 c++20 是安全可靠的,而你弄的那一套栈切换是有问题的。如果那么简单,开源世界早就流行了。
再强调一遍,ucontext 没问题。是你弄的栈切换有问题。
解决办法也很简单,就是别用什么栈切换。
linux/openbsd 都提供了 mmap(MAP_GROWDOWN | MAP_STACK),你用这个申请栈空间,系统帮你做好了内存的自动增长。windows 也有这个功能。
【 在 ylh1969 的大作中提到: 】
: 那几个函数只管ucontext里的栈,不管来自哪里。
--
修改:hgoldfish FROM 110.84.121.*
FROM 110.84.121.*
动态栈空间管理,就是用mmap呀,定义好生命周期和资源投放回收,临界区(4个月的debug,就是处理临界区)处理这些,就没问题,已经投产使用啦。框架调好了,各种应用都没问题。
单线程协程没有临界区,简单多了。你不妨试试。
临界区就是一个任务还没有swap完成,另一个线程就拿到这个任务并企图处理它。
栈切换不是我的事,是那4个函数干的。
【 在 hgoldfish 的大作中提到: 】
: 嗯。没错,只管栈的。这本来也没问题。ucontext 当然是没问题的,不然早就从 POSIX API 里面删掉了。
: c++20 则是把内存申请在堆里面。这就是为啥 c++20 是安全可靠的,而你弄的那一套栈切换是有问题的。如果那么简单,开源世界早就流行了。
: 再强调一遍,ucontext 没问题。是你弄的栈切换有问题。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
没有临界区。但不代表没有锁啊。
锁是同步原型,当你涉及到两个变量的修改,中间存在协程阻塞的时候仍然是需要加锁的。
【 在 ylh1969 的大作中提到: 】
: 动态栈空间管理,就是用mmap呀,定义好生命周期和资源投放回收,临界区(4个月的debug,就是处理临界区)处理这些,就没问题,已经投产使用啦。框架调好了,各种应用都没问题。
: 单线程协程没有临界区,简单多了。你不妨试试。
: 临界区就是一个任务还没有swap完成,另一个线程就拿到这个任务并企图处理它。
: ...................
--
FROM 110.84.121.*
嗯。
要有协程锁,线程锁是锁不住的,都在一个线程里,谁也锁不住谁。
自己弄个软锁了,没有原子性,那个缝挺难办的。
在多线程协程,用线程锁保护软锁,软锁完成前不受别的线程打扰。而在一个线程里只有一个协程,就不会有多个协程互相打扰。
但是延长了切换时间,协程切换快的优势荡然无存,想切一次协程,得切好几次线程。
【 在 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.*
有协程锁的。
你可以看看 python 都有实现。
【 在 ylh1969 的大作中提到: 】
: 嗯。
: 要有协程锁,线程锁是锁不住的,都在一个线程里,谁也锁不住谁。
: 自己弄个软锁了,没有原子性,那个缝挺难办的。
: ...................
--
FROM 110.84.121.*
嗯。
c库基本协程工具不负责处理这个问题,得自己弄。
那么,c++协程库,有谁提供?
【 在 hgoldfish 的大作中提到: 】
: 有协程锁的。
: 你可以看看 python 都有实现。
:
--
FROM 221.218.60.*
C++ 生态的协程库,最完善的是可能我那一套 qtng 了。
虽然 qtng 性能不怎么样,基本没做性能优化。但论 API,还真的是我的最丰富。
因为我就简单抄 Python 的就完事了。Python 有的我就抄,没有的我只添加了一丁点儿。
qtng = gevent + requests + pycrypt + quic
【 在 ylh1969 的大作中提到: 】
: 嗯。
: c库基本协程工具不负责处理这个问题,得自己弄。
: 那么,c++协程库,有谁提供?
: ...................
--
修改:hgoldfish FROM 110.84.121.*
FROM 110.84.121.*
看了,受益匪浅,谢谢!
- 来自 水木社区APP v3.5.7
【 在 ylh1969 的大作中提到: 】
: 看了我俩讨论了吗?协程的使用,需要考虑那么多问题,各家的协程库,它们资源的使用条件和切换机制,都交代清楚了吗?理解透了吗?
--
FROM 123.147.252.*
这帖应该被设精。
【 在 allegro 的大作中提到: 】
: 看了,受益匪浅,谢谢!
: - 来自 水木社区APP v3.5.7
--
FROM 221.218.60.*