网上大部分人都讲boost.asio用完成端口实现,并且实现了线程池,所以效率非常的高。
我在应用asio的时候发现完成端口是有,但是线程池确并不存在,而且在现有的架构下,要想用线程池来实现对数据的处理,可能写出来不是很好看。
asio通过开启线程调用io_service::run再调用win_iocp_io_service::run来处理收到的事件。
size_t run(boost::system::error_code&
ec)
{
if
(::InterlockedExchangeAdd(&outstanding_work_, 0) == 0)
{
ec =
boost::system::error_code();
return
0;
}
call_stack<win_iocp_io_service>::context ctx(this);
size_t n = 0;
while (do_one(true,
ec))
if (n !=
(std::numeric_limits<size_t>::max)())
++n;
return n;
}
do_one里面为
BOOL ok =
::GetQueuedCompletionStatus(iocp_.handle,
&bytes_transferred,
&completion_key, &overlapped, block ? timeout : 0);
operation* op =
static_cast<operation*>(overlapped);
op->do_completion(last_error,
bytes_transferred);
实际上如果op->do_completion里面有时间比较长的操作,这个线程同样为死在这个地方。
因为只有一个线程在驱动前面的run函数。
当然你也可以通过同时启动几个线程来调用run函数,这样是可行的,但是这种手法确很笨拙,因为你可能一下启动10个线程,却只有一个线程比较忙,
或者你的10个线程根本就忙不过来,这根有没有使用iocp完全没什么两样。
做事情要力求完美,不要以为NB的大师不提供的东西,你就不能自已弄一个。其实我觉得asio里面c++的运用,非常的完美,但是从实用的角度来说,
还不如我以前一个同事写的iocp写得好。
我们怎么对asio这部分进行改良,让他支持线程池的方式呢。
实际上我们只需要对win_iocp_io_service进行一些加工即可。
在do_one里面
op->do_completion(last_error,
bytes_transferred);
之前auto_work
work(*this);
这个地方,实际上就是来计算当前有多少工作要做,
这个地方调用work_started
::InterlockedIncrement(&outstanding_work_);
只需要在这按照你的需求加入一个线程就可以了。
算法自已想吧,还存在work_finished函数,可以用来减少线程。
需要给win_iocp_io_service类增加一个thread_group成员变量,供上面使用。
改良的方式不是很好,也比较不好看,
唉,完美只存在心里,适可而止吧。
lixiaomail
2008-08-05
分享到:
相关推荐
《Boost.Asio.C++.Network.Programming.》是关于使用C++进行网络编程的一份资源,主要聚焦于Boost.Asio库的使用。Boost.Asio是一个强大的、跨平台的库,用于处理I/O操作,如网络通信,它使得在C++中编写并发、异步...
书中还涵盖了Boost.Asio的高级主题,如IO服务(IO Service)和工作线程池,这些是实现高效并发处理的基础。通过IO Service,开发者可以统一管理所有异步操作,确保网络事件的正确调度。工作线程池则提供了在多线程...
### C++中文版网络编程Boost Asio知识点概览 #### 一、Boost Asio简介与基础知识 ##### 1.1 Boost Asio概述 - **定义**:Boost Asio 是一个跨平台的 C++ 库,它提供了一种简单且统一的方式来访问底层网络编程接口...
Boost.ASIO提供了线程池和工作队列等机制,帮助开发者轻松实现并发。 7. **错误处理和异常安全**:在实现Web服务器时,必须考虑到各种可能的错误情况,例如网络中断、无效的HTTP请求等。良好的错误处理机制能确保...
利用Boost Asio库开发的大并发量,高性能的网络通讯库,有线程池和即时,定时任务调度功能.zip 利用Boost Asio库开发的大并发量,高性能的网络通讯库,有线程池和即时,定时任务调度功能.zip 利用Boost Asio库开发的...
Boost.Asio允许开发者使用`io_service::work`和线程池来并行处理任务,提高系统的处理能力。`io_service::run()`在没有待处理任务时会自动停止,但`io_service::work`可以防止它过早退出,从而维持工作队列的运行。...
Boost.Asio是C++编程中用于网络通信的一个强大库,主要设计用于处理I/O操作,如网络套接字、定时器、信号等。这个库在C++社区中广受欢迎,因为它提供了一种简洁、高效的方式来编写并发网络应用程序。在"Boost.Asio ...
在MySQL中,Boost可能被用于提供线程池、智能指针、正则表达式、日期时间处理、文件系统操作等功能。例如,Boost.Thread库可以用于实现多线程处理,提高MySQL服务的并发性能;Boost.Asio库可能用于网络通信,优化...
在Boost.Asio中,可以通过设置线程池和工作队列来利用IOCP,进一步提升服务器的并发性能。然而,这需要对IOCP的工作原理有深入理解,并且配置相对复杂。 6. **错误处理与异常安全** 在编写TCP服务器时,必须考虑...
8. **线程池**:虽然Boost库本身不直接提供线程池,但可以使用Boost.Asio库或自定义实现来创建线程池,以提高多任务处理效率。 深入研究Boost线程库源码,程序员不仅可以了解其内部工作原理,还能学习到如何编写...
- **线程池**:使用 `asio::thread_pool` 创建一组工作线程。 - **信号量**:控制资源访问以避免竞态条件。 - **互斥锁**:保护共享数据不被多个线程同时访问。 ### 7. 错误处理与调试技巧 错误处理是确保程序稳定...
9. **高级特性**:进一步探讨Boost.Asio的高级特性,如服务和工作器的自定义、IoContext的管理和工作线程池的配置。 10. **最佳实践**:学习如何优化Boost.Asio的性能,提高网络应用的响应速度和吞吐量,以及如何...
Boost库是C++标准库的一部分,它包含了多个组件,这些组件涉及了数组、线程池、通信库等多方面的功能。Boost库可以用于Linux和Windows平台,是通用的C++编程资源。Boost库的重要性在于它是由C++标准库开发人员编写的...
《Boost ASIO C++ 网络编程 中文版》是一本专为C++开发者深入理解和应用Boost ASIO库进行网络编程而编写的指南。Boost ASIO是C++的一个强大库,它提供了一种跨平台的方式来处理I/O事件,包括网络通信。这本书详细...
在iOS开发中,Boost.Asio库是一个非常重要的工具,它为C++程序员提供了网络编程、异步I/O操作和时间管理的强大支持。本项目“xcode iOS 使用 boost::asio 的 demo”旨在展示如何在iOS应用中集成并使用Boost.Asio库。...
《Boost.Asio编程》是一本深入探讨Boost库中Asio组件的专著,旨在帮助初学者及有经验的开发者理解并掌握这一强大的网络编程工具。Boost.Asio是C++库中的一个子集,它提供了异步I/O操作,使得开发者能够高效地处理...
尽管Boost线程池本身并不直接与`asio`交互,但它们可以一起使用,线程池可以为`asio`的异步操作提供后台线程,使得程序能够处理大量并发的I/O请求。 在`threadpool-0_2_5-src`这个压缩包中,包含了线程池的源代码,...