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实现多线程并发处理,解析了在多线程模型中线程调度的情况以及线程安全问题。在单线程中,事件完成处理器在同一线程中执行,确保变量访问安全。而在多线程环境下,asio会随机选择一个调用io_service::run的线程来执行事件完成处理器,可能导致无序调用和线程不安全。通过使用strand可以确保同一时间只有一个事件处理器运行,但并不能保证执行顺序。通过测试代码展示了多线程并发发送数据时的运行效果。
最低0.47元/天 解锁文章
489

被折叠的 条评论
为什么被折叠?



