多线程中使用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