两个Boost Asio多线程TCP服务器示例哪个更规范正确?
Boost Asio多线程TCP服务器两种实现的正确性分析
我看到了两种不同的Boost Asio多线程TCP服务器实现示例,想请教哪一种是正确的?
第一种实现代码:
std::vector<std::thread> threads; auto count = std::thread::hardware_concurrency(); for (unsigned int n = 0; n < count; ++n) { threads.emplace_back([&] { io_context->run(); }); } for (auto &thread : threads) { if (thread.joinable()) thread.join(); }
第二种实现代码:
auto threads = std::thread::hardware_concurrency(); boost::asio::io_context io_context{(int)threads}; std::vector<std::thread> v; v.reserve(threads - 1); for(auto i = threads - 1; i > 0; --i) v.emplace_back( [&io_context] { io_context.run(); }); io_context.run();
这两种实现都是正确的,核心逻辑完全一致——启动与硬件CPU并发数相等数量的线程来运行io_context的事件循环,以此充分利用多核资源处理异步任务。
细节分析:
第一种实现:
创建和硬件并发数相同的子线程,每个线程执行io_context.run()(代码里的io_context->run()大概率是笔误,若io_context是栈对象应改为.调用),最后主线程等待所有子线程结束。逻辑直观,所有事件循环线程都是子线程,主线程仅负责等待。第二种实现:
创建硬件并发数-1个子线程执行io_context.run(),同时主线程自己也调用io_context.run(),最终总共有和硬件并发数相等的线程在运行事件循环。这种方式复用了主线程,少创建一个子线程,效果和第一种完全等价。
Boost Asio的io_context本身支持多线程同时调用run(),内部已做线程安全处理,多个线程会自动共享处理队列中的异步任务,所以两种方式都能正确实现多线程TCP服务器的需求。
内容的提问来源于stack exchange,提问作者huvcbo
相关产品推荐
相关产品推荐

