从不同线程在同一个 io_context 实例上调用 co_spawn 是否安全,并且是否保证在同一线程上执行?

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

我正在开发一个跨不同线程利用 boost::asio::io_context 的项目,具体来说,我想使用 co_spawn 来启动协程。这是一个简化的代码片段:

#include <boost/asio.hpp>
#include <boost/asio/co_spawn.hpp>
#include <boost/asio/detached.hpp>
#include <thread>

boost::asio::awaitable<void> my_coroutine() { /* ... */ }

void worker_thread(boost::asio::io_context& io)
{
  boost::asio::co_spawn(io, my_coroutine, boost::asio::detached);
}

int main()
{
  boost::asio::io_context io;
  std::thread main_thread([&io](){ io.run(); });
  std::thread worker_thread(worker_thread, std::ref(io));
  main_thread.join();
  worker_thread.join();
  return 0;
}

我有两个不确定的问题:

  1. 这样安全吗?如果以这种方式跨不同线程使用 io_context,我能否确定此代码不会出现并发访问问题?

  2. 是否保证在同一个线程上执行?是否可以保证 co_spawn 启动的协程将与 io_context 在同一线程上运行,或者是否存在在不同线程上调用它的风险?

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