You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

boost::asio C++20协程是否支持多线程?有无多线程示例?

关于boost::asio C++20协程的多线程支持及相关示例

1. C++20协程的多线程支持

boost::asio的C++20协程完全支持多线程场景,核心实现上可以通过以下方式实现多线程协程调度:

  • 启动多个线程调用io_context::run(),让协程任务可以在这些线程上并发执行
  • 使用strand序列化协程执行,避免共享资源的竞态问题——协程可通过strand绑定到特定执行序列,即使底层io_context是多线程运行的
  • co_spawn函数可指定协程的执行上下文,你可以传入strand或多线程的io_context实例,灵活控制协程的运行线程

2. 官方多线程相关示例

boost::asio官方文档中并非只有单线程示例,多线程相关的示例可在以下场景中找到:

  • 多线程io_context运行示例:官方有展示如何启动多个线程驱动io_context,配合协程实现任务并发执行。示例片段如下:
#include <boost/asio.hpp>
#include <thread>
#include <vector>
#include <coroutine>

using namespace boost::asio;

asio::awaitable<void> task(int id) {
  // 模拟任务操作
  co_await asio::steady_timer(co_await asio::this_coro::executor, std::chrono::seconds(1)).async_wait(asio::use_awaitable);
  printf("Task %d completed on thread %d\n", id, static_cast<unsigned int>(std::this_thread::get_id()));
}

int main() {
  asio::io_context io_ctx;
  // 启动3个线程运行io_context
  std::vector<std::thread> threads;
  for (int i = 0; i < 3; ++i) {
    threads.emplace_back([&io_ctx]() { io_ctx.run(); });
  }

  // 提交多个协程任务
  for (int i = 0; i < 5; ++i) {
    co_spawn(io_ctx, task(i), asio::detached);
  }

  io_ctx.stop();
  for (auto& t : threads) {
    t.join();
  }
  return 0;
}
  • strand与协程结合的线程安全示例:官方文档中也有展示如何用strand保护共享数据,确保协程对共享资源的访问是串行化的,即使在多线程io_context环境下也不会出现竞态。

内容的提问来源于stack exchange,提问作者AeroSun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:25:43