Boost.asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全

本文介绍了如何使用Boost.asio实现多线程并发处理,解析了在多线程模型中线程调度的情况以及线程安全问题。在单线程中,事件完成处理器在同一线程中执行,确保变量访问安全。而在多线程环境下,asio会随机选择一个调用io_service::run的线程来执行事件完成处理器,可能导致无序调用和线程不安全。通过使用strand可以确保同一时间只有一个事件处理器运行,但并不能保证执行顺序。通过测试代码展示了多线程并发发送数据时的运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实现多线程方法:

其实就是多个线程同时调用io_service::run

   

for(int i = 0; i < iThreads; i++){//创建线程,函数体是CIoService::run
    CThreadPtr oThreadPtr(new CThread(boost::bind(&CIoService::run, &oIoSrv)));
    vecThreads.push_back(oThreadPtr);
}

2、多线程调度情况:

asio规定:只能在调用io_service::run的线程中才能调用事件完成处理器。

注:事件完成处理器就是你async_accept、async_write等注册的句柄,类似于回调的东西。

单线程:

如果只有一个线程调用io_service::run,根据asio的规定,事件完成处理器也只能在这个线程中执行。也就是说,你所有代码都在同一个线程中运行,因此变量的访问是安全的。

多线程:

如果有多个线程同时调用io_service::run以实现多线程并发处理。对于asio来说,这些线程都是平等的,没有主次之分。如果你投递

### 使用 `boost::asio` 实现多线程并发处理 为了实现多线程环境下高效的异步 I/O 操作,`boost::asio` 提供了一系列工具来简化这一过。核心组件包括 `io_context`、`strand` 工作守护对象。 #### io_context 的作用 `io_context` 是所有异步操作的核心调度器,在多线程环境中,可以通过创建多个线并让它们都运行同一个 `io_context` 来分担任务负载[^1]。 ```cpp #include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_context ioc; // 启动多个线执行 io_context.run() std::vector<std::thread> threads; const int thread_count = 4; // 假设有四个 CPU 核心可用 for (int i = 0; i < thread_count; ++i) { threads.emplace_back([&ioc]() { ioc.run(); }); } // 让主线等待其他线完成 for (auto& t : threads) { if (t.joinable()) t.join(); } } ``` #### Strand 的重要性 当存在多个异步调用可能竞争同一资源时,使用 `boost::asio::strand` 可以确保这些调用按顺序串行化执行,防止竞态条件的发生。 ```cpp boost::asio::io_context ioc; boost::asio::ip::tcp::socket socket(ioc); boost::asio::strand<boost::asio::io_context::executor_type> strand{ioc.get_executor()}; // 将异步操作提交给特定的 strand 执行 socket.async_read_some(boost::asio::buffer(data), strand.wrap(std::bind(...))); ``` #### 工作守护对象 Work Guard 为了避免 `io_context::run()` 方法因无待处理事件而提前返回,通常会引入一个名为 work guard 的机制来保持至少有一个活动的工作项直到序真正结束前。 ```cpp boost::asio::io_context ioc; auto work_guard = make_work_guard(ioc); std::vector<std::thread> threads; for (unsigned i = 0; i < num_threads; ++i){ threads.emplace_back( [&ioc]{ ioc.run(); }); // 运行 io_context } // 当不再需要继续运行时销毁 work_guard 对象 work_guard.reset(); // 加入所有子线 for(auto &t : threads) t.join(); ``` 通过上述方式组合运用 `io_context`, `strand` 工作守护者模式,可以在 C++ 中构建高效稳定的多线程网络应用序框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值