- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
结构任务修改自https://github.com/Quuxplusone/coro/blob/master/include/coro/gor_task.h .我只是更改suspend_always
in Line 18暂停_never。
// test.cpp
#include <exception>
#include <experimental/coroutine>
#include <variant>
template<class T>
struct task {
struct promise_type {
std::variant<std::monostate, T, std::exception_ptr> result_;
std::experimental::coroutine_handle<void> waiter_;
task get_return_object() { return task(this); }
auto initial_suspend() { return std::experimental::suspend_never{}; } // Originally suspend_always
auto final_suspend() {
struct Awaiter {
promise_type *me_;
bool await_ready() { return false; }
void await_suspend(std::experimental::coroutine_handle<void> caller) {
me_->waiter_.resume();
}
void await_resume() {}
};
return Awaiter{this};
}
template<class U>
void return_value(U&& u) {
result_.template emplace<1>(static_cast<U&&>(u));
}
void unhandled_exception() {
result_.template emplace<2>(std::current_exception());
}
};
bool await_ready() { return false; }
void await_suspend(std::experimental::coroutine_handle<void> caller) {
coro_.promise().waiter_ = caller;
coro_.resume();
}
T await_resume() {
if (coro_.promise().result_.index() == 2) {
std::rethrow_exception(std::get<2>(coro_.promise().result_));
}
return std::get<1>(coro_.promise().result_);
}
~task() {
coro_.destroy();
}
private:
using handle_t = std::experimental::coroutine_handle<promise_type>;
task(promise_type *p) : coro_(handle_t::from_promise(*p)) {}
handle_t coro_;
};
#include <stdio.h>
task<int> f2() {
puts("enter f2");
co_return 1;
}
task<int> f1() {
puts("enter f1");
int a = co_await f2();
printf("f2 return: %d\n", a);
co_return a;
}
int main() {
f1();
}
$ clang++ -fcoroutines-ts -std=c++17 -stdlib=libc++ -lc++ -lc++abi test.cpp -o test
$ ./test
enter f1
enter f2
fish: './test' terminated by signal SIGSEGV (Address boundary error)
因为没有 co_await
,我希望 f2 return: 1
应该被打印并且程序应该正常退出,但它因段错误而崩溃。为什么以及如何解决此问题?
最佳答案
当协程函数执行 co_await
时,它会停止该函数的执行并将该执行的恢复安排给其他人。这个“其他人”最终取决于被 co_await
处理的表达式、协程函数的 promise 类型以及协程返回的 future 类型。
那么让我们看看这里的控制流。
f2
被调用。它执行,然后通过 co_return
终止。这意味着 f2
的协程句柄是完整的。这也意味着将调用 promise 类型的 final_suspend
。好吧,协程机制期望 final_suspend
将返回一个等待类型,您的 task::promise
提供了它。
除了... task::promise::waiter_
未初始化。这是因为只有await_suspend
给waiter_
赋值。还没有人对 f2
的返回值进行 co_await
编辑。因此,在此之前,waiter_
没有值。
因此,当 f2
被调用时,您尝试继续一个充其量为 nullptr
的协程句柄,从而导致崩溃。
如果 final_suspend
的 Awaiter
类型首先检查 waiter_
是否为 nullptr
会更有意义(这意味着还没有人在等待协程)如果是,则从 await_ready
返回 true
。
关于C++ 协程 : call a coroutine function without co_await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434882/
GCC 允许从 catch 恢复 C++20 协程部分并在协程中调用 co_await再次来自其 catch部分。 在这种情况下,当前处理的异常被认为是什么? 请考虑一个例子: #include #
我尝试尝试本文中提到的 co_await https://blogs.msdn.microsoft.com/vcblog/2016/04/04/using-c-coroutines-to-simpli
我在 Internet 上进行了搜索,试图找到 co_await 运算符的作用,但我仍然无法理解。我猜是下面的代码: co_await foo(); 暂停协程直到 foo 完成,但在这种情况下它与简单
我有一个异步函数 void async_foo(A& a, B& b, C&c, function callback); 我想在无堆栈协程中使用它,所以我写 auto coro_foo(A& a, B
#include #include template struct Awaiter final { bool await_ready() const { return false; }
我想知道是否可以找到可等待的 co_await 的结果类型: 由于无法在未评估的上下文中使用 co_await,我不能这样做 template task<> f(Awaitable&& awaitab
我想知道 co_waiting 具有通过引用捕获的临时值的协程是否有效。那么下面的代码是否有效,我想编译器是否应该将临时变量放在协程框架中作为局部变量: task g(const S&); task
以下代码: try { throw 42; } catch (int i) { co_await somefuture; } 使用带有 -fcoroutines-ts 的 clang 6 和
我有一个 Win32 程序,我想在其中添加一些 winRT 调用。除其他事项外,我想打开一个没有 GUI 界面的文件。 我使用 StorageFile 类的异步文件打开调用,因为下一个调用需要一个 I
我正在尝试使用 boost asio 的 C++20 协程。我目前的意图是嵌入来自 https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/
我正在基于 windows io 完成端口的异步套接字类中添加对协程 ts 的支持。 如果没有协程,io 可以这样完成: sock.async_write(io::buffer(somebuff),
一个简单的函数: awaitable write(const std::vector& data) { auto token = co_await this_coro::token();
以下代码不符合我的预期。 #include #include #include struct symmetic_awaitable { std::coroutine_handle<> _
这个问题已经有答案了: Is it possible to co_await in a catch clause? (1 个回答) 已关闭去年。 我有一个如下所示的代码: auto func() ->
这个问题已经有答案了: Is it possible to co_await in a catch clause? (1 个回答) 已关闭去年。 我有一个如下所示的代码: auto func() ->
结构任务修改自https://github.com/Quuxplusone/coro/blob/master/include/coro/gor_task.h .我只是更改suspend_always
我有一个由 Asio 用 one io_context per thread 编写的 HTTP 服务器库模型。它有一个 io_context_pool检索一个 io_context有顺序地。所以当服务
说到 Boost Asio,我完全是个新手。我玩过回调,一切正常。但是,现在我正在尝试切换到协程,但我遇到了 co_await 的问题。 Visual Studio 2017 社区版说 “此 co_a
我已经安装了 windows 10.0 visual studio 2017(15.2 版)我已经为我的项目(包括 cpprestsdk)从 VS2013 迁移到 VS2017,并使用 co_awai
网上有一些链接 [1 , 2]建议 co_await 应该与 std::experimental::optional 一起使用,并且 VS 2015 Update 2 应该支持它。由于 VS 即使在
我是一名优秀的程序员,十分优秀!