c++ 如何在boost asio协程中自定义协程状态?

q5iwbnjs  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(181)

问题是,我想创建一个全局示例,我将能够单独使用每个协程,以保持在那里,例如,命名范围的列表,例如,出于日志的目的。
从而当boost::asio::spawn被调用时,新的自定义状态将被附加到新运行的协同程序。
作为一种猜测,作为一种变通方法,它可以通过一个由smth索引的全局std::unordered_map来完成,类似于std::this_thread::get_id(),但用于协程,但目前我还不知道类似的事情。
如果可以通过定制asio::yield_context来实现这一点,那就太完美了。它可以保持cancellation_slotexecutor,为什么它不能保持额外的状态呢?我已经尝试挖掘yield_context的增强源,但是我在那里迷路了,这就是为什么我希望在这个问题上有一些见解。

juzqafwq

juzqafwq1#

您需要为自定义类型实现await_transform。这允许您与承诺类型通信。当然,这是库的实现细节,因此您还没有看到它。
下面是this_coro::executor_t的await_transform:

// This await transformation obtains the associated executor of the thread of
  // execution.
  auto await_transform(this_coro::executor_t) noexcept
  {
    struct result
    {
      awaitable_frame_base* this_;

      bool await_ready() const noexcept
      {
        return true;
      }

      void await_suspend(coroutine_handle<void>) noexcept
      {
      }

      auto await_resume() const noexcept
      {
        return this_->attached_thread_->get_executor();
      }
    };

    return result{this};
  }

您可以使用自己的promise-type创建自己的可等待类型,这会添加自定义状态。
这里有大量的代码,编写起来会很困难(对我来说是)。您可能应该阅读更简单的协程教程(尽可能“简单”,但并不十分简单)。
我听过很多精彩的演讲

Raymond Chen的这篇博客系列文章看起来非常贴切。特别是这篇文章应该会让你接近目标:C++ coroutines: Snooping in on the coroutine body

相关问题