C++ Boost::Asio io_context多线程分组情况下异步任务分组

多线程中使用io_context情景

第一种方式是同步使用io_context,即Asio的所有async函数与io_context均在一个线程,io_context会一直阻塞,直到没有后续任务时退出(不使用worker的情况下)。

第二种情况是一个io_context,在多个线程中执行io_context.run(),这种情况下,异步任务会随机被空闲的线程执行。此时会存在并发问题,解决办法是使用io_context::strand,绑定到同一个strand的异步任务会被绑定到固定的一个线程,并顺序执行。

第三种情况是每个线程创建一个io_context,每个线程的异步任务全部给本线程的io_context处理,这种情况也不存在多线程导致的io_context并发导致相应数据共享问题。

还有一种情况,在主线程中创建io_context并运行,但是在创建的线程中,调用异步任务,此时也存在数据跨线程同步问题,此时线程中读写数据,需要使用原子操作及指定memory model。

多线程共享一个io_context,使用io_context::strand

多线程共享同一个io_context情景如下:

io::io_context io_context;
  std::vector<std::thread> threads;
  auto count = std::thread::hardware_concurrency() * 2;

  for (int n = 0; n < count; ++n) {
    threads.emplace_back([&] { io_context.run(); });
  }

  for (auto 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值