当前位置:   article > 正文

C++20 协程(一)_c++20协程示例

c++20协程示例

协程是C++20最重要的特性,C++的异步编程模式有了协程将会变得简单。协程是能暂停执行以在之后恢复的函数。C++20协程是无栈的在堆上分配一个协程帧,把函数的参数拷贝到协程帧里,会在协程帧里创建promise对象。它们通过返回到调用方暂停执行,并且从栈分离存储恢复执行需要的数据。这样就可以编写异步执行的顺序代码(例如不使用显式的回调来处理非阻塞 I/O),还支持对惰性计算的无限序列上的算法及其他用途。

协程与函数

协程是一个有点特殊的函数,相比普通函数协程的特殊之处在于它可以暂停和恢复,如下图所示:

如果一个函数中出现了co_await、co_return和co_yield这三个关键字之一,那么这个函数就是一个协程。

举例子

关键词 co_return 完成执行并返回一个值:

  1. #include <coroutine>
  2. #include <iostream>
  3. #include <memory>
  4. template<typename T>
  5. struct MyFuture {
  6. std::shared_ptr<T> value;
  7. MyFuture(std::shared_ptr<T> p) : value(p) {} // (3)
  8. ~MyFuture() { }
  9. T get() { // (10)
  10. return *value;
  11. }
  12. struct promise_type {
  13. std::shared_ptr<T> ptr;
  14. promise_type(): ptr(std::make_shared<T>()) { // (4)
  15. }
  16. ~promise_type() { }
  17. MyFuture<T> get_return_object() { // (7)
  18. return ptr;
  19. }
  20. void return_value(T v) { // (8)
  21. *ptr = v;
  22. }
  23. std::suspend_never initial_suspend() { // (5)
  24. return {};
  25. }
  26. std::suspend_never final_suspend() noexcept { // (6)
  27. return {};
  28. }
  29. void unhandled_exception() {
  30. std::exit(1);
  31. }
  32. };
  33. };
  34. MyFuture<int> createFuture() {
  35. co_return 2022; // (9)
  36. }
  37. int main() {
  38. auto fut = create
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/208421?site
推荐阅读
相关标签
  

闽ICP备14008679号