- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个异步函数
void async_foo(A& a, B& b, C&c, function<void(X&, Y&)> callback);
我想在无堆栈协程中使用它,所以我写
auto coro_foo(A& a, B& b, C& c, X& x) /* -> Y */ {
struct Awaitable {
bool await_ready() const noexcept { return false; }
bool await_suspend(coroutine_handle<> h) {
async_foo(*a_, *b_, *c_, [this, h](X& x, Y& y){
*x_ = std::move(x);
y_ = std::move(y);
h.resume();
});
}
Y await_resume() {
return std::move(y);
}
A* a_; B* b_; C* c_; X* x_; Y y_;
};
return Awaitable{&a, &b, &c, &x};
}
然后我可以这样使用它:
Y y = co_await coro_foo(a, b, c, x);
编译器会将其重写为:
auto e = coro_foo(a, b, c, x);
if (!e.await_ready()) {
<suspend>
if (e.await_suspend(h)) return;
resume-point:
<resume>
}
Y y = e.await_resume();
有了这个,协程将在挂起时保留 a_
、b_
和 c_
,此时它只需要保留它们直到我们在await_suspend(h)
中获取coroutine_handle
。
(顺便说一句,我不确定我是否可以在此处保留对参数的引用。)
如果包装函数可以直接获取coroutine_handle
作为参数,效率会高很多。
它可能是一个隐式参数:
Promise f(coroutine_handle<> h);
co_await f();
或者它可以是一个特殊的关键字参数:
Promise f(coroutine_handle<> h);
f(co_await);
我是不是漏掉了什么? (其他开销不是那么大。)
最佳答案
Coroutine TS 定义的“协程”系统旨在处理异步功能:
async_foo
不满足这些要求。它不会返回类似 future 的对象;它通过延续函数“返回”一个值。并且此延续作为参数传递,而不是您对对象的返回类型执行的操作。
到 co_await
时发生了,生成 future 的潜在异步过程预计已经开始。或者至少,co_await
机械使其可能开始。
您建议的版本在 await_ready
上失败了功能,这是允许 co_await
的原因处理潜在的异步进程。在生成 future 的时间和 await_ready
之间被调用,该过程可能已经完成。如果有,则无需安排协程的恢复。因此,它应该发生在此处,在此线程上。
如果堆栈的低效率问题困扰着您,那么您将不得不按照 Coroutine TS 要求的方式做事。
处理此问题的一般方法是 coro_foo
会直接执行async_foo
并返回一个类似 future 的对象 .then
-样机制。你的问题是 async_foo
本身没有 .then
-like 机制,所以你必须创建一个。
这意味着 coro_foo
必须通过async_foo
存储 coroutine_handle<>
的仿函数,一个可以通过 future 的延续机制更新的。当然,您还需要同步原语。如果在执行仿函数时句柄已经初始化,则仿函数调用它,恢复协程。如果仿函数在没有恢复协程的情况下完成,则仿函数将设置一个变量,让等待机器知道该值已准备就绪。
由于句柄和此变量在 await 机制和仿函数之间共享,因此您需要确保两者之间的同步。这是一件相当复杂的事情,但无论如何.then
式机械要求。
或者您可以忍受轻微的低效率。
关于c++ - co_await 似乎不是最优的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311488/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!