没错。这就是我之前一直在说的“轻量级线程”的底层概念。
你这说得很好。
【 在 Maksim (Marksim) 的大作中提到: 】
: 标 题: Re: 看了网上讲C++20 coroutine的十几篇介绍文章,竟然还是云里
: 发信站: 水木社区 (Sat Aug 8 18:29:25 2020), 站内
:
: 虽然从最底层的实现上,coroutine 和 thread 类似,但他们对开发者暴露的用途不一样.
:
: coroutine 很重要的一点是提供了在一个线程内部不同 task 间轻量级的切换。在线程内部,用户就可以根据自己的需求来协调。外部来看仍一个线程pin在一个 core 上满载,最大化性能。这个理念,在现代高性能事务处理里很常见。比如,事务A想拿锁,看到已经被事务B占了,事务A必须要 yield。这里A,B 和锁的结构可以都在一个线程内部,没有 I/O,但还是有逻辑上的 block和 yield。
:
: 至于为什么有同步,有 channel。因为 coroutine 也可以在不同线程上。一个线程内部不需要同步,但是两个 coroutine 在不同线程上就需要了。我觉得这样的抽象可以把 coroutine 和物理的线程彻底解耦开,为开发者性能优化提供方便。比如根据 task 的数量,动态分配物理线程执行,用最少的线程 (CPU cores),做最多的事情。每个 task的开发不用特别关心需要交互的task在一个线程内部,还是另外一个线程里。
:
: 【 在 hgoldfish 的大作中提到: 】
: : async/await 只是助记词,纯粹是编译器弱爆了才需要这俩。你可以试试去掉这两个助记词,会发现完全不会影响程序的可阅读性,反而更清晰了。所以在我看来,python, c#, js 还有现在 c++20 的 coroutine 都是走上了歧路。以前 python gevent 那种玩法才接近完美。
: : coroutine 跟 thread 在实现上原本就是一样的,如果你不理解 coroutine 跟 thread 是一样的,你就没法理解 coroutine 为什么需要同步语义,等你写多了 corotuine 早晚有一天会出事的。试试解释一下如果 coroutine 没有 thread 的语义,goroutine 为什么要用 channel 这种消息管道,而不是直接传递值。
: :
:
: --
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 167.220.233.*]
--
FROM 76.126.252.*