Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

co_yield #53

Open
naonao-cola opened this issue Dec 16, 2024 · 7 comments
Open

co_yield #53

naonao-cola opened this issue Dec 16, 2024 · 7 comments

Comments

@naonao-cola
Copy link

请问下这个里面有没得co_yield 这个东西

@microcai
Copy link
Member

没有。这个东西是一种错误的设计,没有任何使用价值。

@naonao-cola
Copy link
Author

没有。 这个东西是一种错误的设计,没有任何使用价值。

那怎么样才能让函数执行一半,下次执行的时候接着执行,而不是返回。这个的话再现在的框架里该怎么写。

@microcai
Copy link
Member

看 示例代码啊。例子里的代码不都是执行一半然后继续执行的吗?

@naonao-cola
Copy link
Author

看 示例代码啊。例子里的代码不都是执行一半然后继续执行的吗?

#include <iostream>
#include "ucoro/awaitable.hpp"
ucoro::awaitable<int> C(int value){
	co_return (value * 100);
}
ucoro::awaitable<void> B(int value){
	auto comput_promise = C(value);
	auto ret = co_await std::move(comput_promise);
	std::cout << "return: " << ret << std::endl;
        std::cout << "yied1: " << ret << std::endl;
        std::cout << "yied2: " << ret << std::endl;
}
ucoro::awaitable<void> A(){
	for (auto i = 0; i < 100; i+=2){
		co_await B(i);
	}
}
int main(int argc, char **argv){
	coro_start(A(), str);
	return 0;
}

就像这段代码示例里面,是A调用B,B调用C。在B里面调用C,是co_wait的形式等待C执行完再到B。也是执行到一半后面继续执行。我的想法是,A调用B的时候,第一次循环卡在B里面,譬如std::cout << "return: " << ret << std::endl;,停留在这一行。下一次A再调用B的时候从 std::cout << "yied1: " << ret << std::endl; 这一句开始执行。不通过C函数的关系的这种,该怎么写。没太懂这种的。请教下这种。谢谢

@microcai
Copy link
Member

首先,你这种需求就不应该使用协程。甚至根本不需要使用协程就能实现。
不知道你有没有用过 std::uniform_distribution 和 std::random_device
uniform_distribution 每次调用 random_device , random_device 的输出都是从上次未完的地方继续的。

其实这种东西根本就不需要协程就能实现。就只需要写一个 operator() 加个 switch case 就好了。

协程解决的是另外的问题,就是 A 调用 B , 然后 B 退出了。并没有返回给 A 。 因为 B 把执行流程直接来个远程大跳转,跳去了
事件循环里去了。

然后事件循环过了很久很久,终于从操作系统拿到了需要的东西,然后直接跳回 B 。 B 就这么被复活了。复活的时候还保留上一次死亡时候的全部状态。然后还顺便把 A 也复活了。
然后 B 就正常的返回到了 A, 然后 A 也继续运行。

懂了吗? 这套流程,才是使用以前的 operator()() + switch case 模式下,非常难写的。这种流程,才有必要使用 c++20 的新语法糖。

@naonao-cola
Copy link
Author

首先,你这种需求就不应该使用协程。甚至根本不需要使用协程就能实现。 不知道你有没有用过 std::uniform_distribution 和 std::random_device uniform_distribution 每次调用 random_device , random_device 的输出都是从上次未完的地方继续的。

其实这种东西根本就不需要协程就能实现。就只需要写一个 operator() 加个 switch case 就好了。

协程解决的是另外的问题,就是 A 调用 B , 然后 B 退出了。并没有返回给 A 。 因为 B 把执行流程直接来个远程大跳转,跳去了 事件循环里去了。

然后事件循环过了很久很久,终于从操作系统拿到了需要的东西,然后直接跳回 B 。 B 就这么被复活了。复活的时候还保留上一次死亡时候的全部状态。然后还顺便把 A 也复活了。 然后 B 就正常的返回到了 A, 然后 A 也继续运行。

懂了吗? 这套流程,才是使用以前的 operator()() + switch case 模式下,非常难写的。这种流程,才有必要使用 c++20 的新语法糖。

谢谢,懂起了。

@microcai microcai reopened this Dec 18, 2024
@microcai
Copy link
Member

关闭的议题会被默认隐藏掉,这不是bug,所以没必要关掉它。开在这里让后面的人可以不用特意点已关闭的议题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants