如何处理删除类中的协程?

问题描述 投票:0回答:0

我有一个包含协程方法的类。如果协程被执行并在暂停状态下等待,则对象可能会被删除。在某些时候协程将在它的类被删除时恢复。

在传统的异步代码中,我使用一些钩子(如

callback_hook on_something(std::function<void(int)> callback)
)制作方法,并且 callback_hook 是一个 RAII 对象,其生命周期与回调耦合。因此,如果回调接收器被删除并且可以删除回调,我会收到通知。

但是我没有看到任何可能的协程解决方案。我不知道我是否可以安全地删除具有一些可等待方法的对象。

参见示例:

#include <iostream>
#include <string>
#include <boost/asio.hpp>


struct destroy_test {
  int something {0};

  ~destroy_test() {
    std::cout << "destroy_test destructor\n";
  }

  boost::asio::awaitable<void> foo(boost::asio::any_io_executor ioc) {
    std::cout << "now accessing deleted data...\n";
    something = 3; // Error
    co_return;
  }
};

int main() {
  boost::asio::io_context io;
  destroy_test *dt = new destroy_test();
  boost::asio::co_spawn(io, [dt]() -> boost::asio::awaitable<void> { delete dt; co_return; }, [](std::exception_ptr e) {});
  boost::asio::co_spawn(io, dt->foo(io.get_executor()), [](std::exception_ptr e) {});
  io.run();
}

在 Coliru 上运行

c++ boost coroutine asio
© www.soinside.com 2019 - 2024. All rights reserved.