- 主题:看了网上讲C++20 coroutine的十几篇介绍文章,竟然还是云里雾里
云里雾里有点夸张,但的确没有那种醍醐灌顶的感觉
就没人能从存在的问题,需求, 到实现方案,具体应用串起来
文章一般是告诉你函数要暂停恢复,然后告诉你promise, future, generator
好像就在讲两头,中间深入的点都讲不清楚
--
修改:eematlab FROM 64.207.220.*
FROM 64.207.220.*
微软有个例子,用libuv做调度的,不过那个例子有点复杂。
MS这帖子格式乱七八糟的,尾部有git repo url
https://devblogs.microsoft.com/cppblog/using-ibuv-with-c-resumable-functions/
其他的例子则过于简单了,而且说得不清楚。
--
FROM 125.33.231.*
coroutine是独立的概念,所以不是看不懂cpp20的coroutine,是看不懂coroutine。
看wikepedia的词条有帮助。
我的理解:你有2个函数,routine1 ,routine2。这俩函数呢,比较变态,
都有goto,routine1执行一半,比如做好个蛋糕,goto到 routine2。routine2
接力把routine1的蛋糕吃掉,然后再goto到routine1。routine1继续做蛋糕……
因为是两个routine合作,所以叫coroutine。因为是goto,还在同一线程,所以
没有切换开销。上面的例子就是消费者生产者模型。
【 在 eematlab 的大作中提到: 】
: 云里雾里有点夸张,但的确没有那种醍醐灌顶的感觉
: 就没人能从存在的问题,需求, 到实现方案,具体应用串起来
: 文章一般是告诉你函数要暂停恢复,然后告诉你promise, future, generator
: ...................
--
FROM 117.39.196.*
需求就是网络编程。。
标准委员会生产的那些标准就是垃圾啊。。像我一样把 coroutine 做得跟 thread 一模一样,就很容易理解了。。
scoped_ptr<Socket> server(Socket::createServer(QHostAddress::AnyIPv4, port));
CoroutineGroup workers;
while (true) {
shared_ptr<Socket> request(server.accept());
if (!request)
break;
workers.spawn([request] {
request->sendall("hello!");
request->close();
});
}
瞧,跟 thread 一模一样,压根不需要去理解那些 promise, future 什么的。
【 在 eematlab (一辰未冉) 的大作中提到: 】
: 云里雾里有点夸张,但的确没有那种醍醐灌顶的感觉
: 就没人能从存在的问题,需求, 到实现方案,具体应用串起来
: 文章一般是告诉你函数要暂停恢复,然后告诉你promise, future, generator
: ...................
--
FROM 27.151.153.*
这种写法不好用。
现在流行是让多线程长得像单线程。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 标 题: Re: 看了网上讲C++20 coroutine的十几篇介绍文章,竟然还是云里
: 发信站: 水木社区 (Thu Aug 6 19:12:37 2020), 站内
:
: 需求就是网络编程。。
:
: 标准委员会生产的那些标准就是垃圾啊。。像我一样把 coroutine 做得跟 thread 一模一样,就很容易理解了。。
:
: scoped_ptr<Socket> server(Socket::createServer(QHostAddress::AnyIPv4, port));
: CoroutineGroup workers;
:
: while (true) {
: shared_ptr<Socket> request(server.accept());
: if (!request)
: break;
: workers.spawn([request] {
: request->sendall("hello!");
: request->close();
: });
: }
:
: 瞧,跟 thread 一模一样,压根不需要去理解那些 promise, future 什么的。
:
: 【 在 eematlab (一辰未冉) 的大作中提到: 】
: : 云里雾里有点夸张,但的确没有那种醍醐灌顶的感觉
: : 就没人能从存在的问题,需求, 到实现方案,具体应用串起来
: : 文章一般是告诉你函数要暂停恢复,然后告诉你promise, future, generator
: : ...................
:
: --
: 灭绝人性啊
:
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 27.151.153.*]
--
FROM 76.126.252.*
coroutine我早懂了, 不懂的是c 的实现细节。
【 在 DoorWay 的大作中提到: 】
:
: coroutine是独立的概念,所以不是看不懂cpp20的coroutine,是看不懂coroutine。
: 看wikepedia的词条有帮助。
:
: 我的理解:你有2个函数,routine1 ,routine2。这俩函数呢,比较变态,
: 都有goto,routine1执行一半,比如做好个蛋糕,goto到 routine2。routine2
: 接力把routine1的蛋糕吃掉,然后再goto到routine1。routine1继续做蛋糕……
:
: 因为是两个routine合作,所以叫coroutine。因为是goto,还在同一线程,所以
: 没有切换开销。上面的例子就是消费者生产者模型。
:
: --
:
发自「今日水木 on PCT-AL10」
--
FROM 101.86.16.*
网络异步编程我用epoll notifyevent实现过, 就是事件加回调。我看不清楚的是c 20里coroutine规范和实现细节, 用一个个没讲清楚的名词来解释另一个名词
【 在 hgoldfish 的大作中提到: 】
:
: 需求就是网络编程。。
:
: 标准委员会生产的那些标准就是垃圾啊。。像我一样把 coroutine 做得跟 thread 一模一样,就很容易理解了。。
:
: scoped_ptr server(Socket: : createServer(QHostAddress: : AnyIPv4, port));
: CoroutineGroup workers;
:
: while (true) {
: shared_ptr request(server.accept());
: if (!request)
: break;
: workers.spawn(\[request\] {
: request->sendall("hello!");
: request->close();
: });
: }
:
: 瞧,跟 thread 一模一样,压根不需要去理解那些 promise, future 什么的。
:
: --
: 灭绝人性啊
:
:
发自「今日水木 on PCT-AL10」
--
FROM 101.86.16.*
我草率了 ~ 我只是泛泛了解,平时用不到,没深究。
你可以梳理下,提个具体的问题,掀起讨论,
有特别懂的大神,会出来讲c实现细节。——比如,我举例
的goto,编译器生成 jmp 指令;
【 在 eematlab 的大作中提到: 】
: coroutine我早懂了, 不懂的是c 的实现细节。
: 发自「今日水木 on PCT-AL10」
--
修改:DoorWay FROM 1.80.222.*
FROM 1.80.222.*
我一直在等待coroutine和c++20。
自己的手头练习的project都停下来了,准备学习这个大monster。
--
FROM 209.249.20.*
有两种 coroutine 的实现方法。
一是在编译时把 coroutine 函数变换成 coroutine 对象,其中的所有本地变量都变换成对象的成员变量,原 coroutine 变换成 operator(),再添加一个状态. 原 coroutine 函数在开始处插入根据当前状态跳转 co_yield 语句的一系列 switch() 语句。
二是使用汇编的 jmp. 当一个函数调用了 yield_coroutine() 跳到另外一个 coroutine 时,就保存当前 CPU 内所有的寄存器值,恢复目标 coroutine 的寄存器值,再执行一个 jmp 搞定。
前者是显式的,cpp20 采用的就是这种办法。后者是隐式的,我自己写的 coroutine 库采用这种办法。
【 在 eematlab (一辰未冉) 的大作中提到: 】
: coroutine我早懂了, 不懂的是c 的实现细节。
: 发自「今日水木 on PCT-AL10」
--
FROM 112.47.122.*