- 1、本文档共60页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ACE线程池
ACE 线程池同时处理多个客户请求,选择:为每个请求派生一个新线程;为每个连接/会话派生一个新线程;预先派生一池首管线程,也就是创建一个线程池;线程池模型有两种变种:半同步/半异步(half-sync/half-asynv model)一个侦听线程会异步地接收请求,并在某个队列中缓冲它们。另一组工作者线程负责同步地处理这些请求。层次:1.异步层:负责接收异步请求;2.排队层:负责对请求进行缓冲;3.同步层:含有若干阻塞在排队层上的控制线程;优点:+排队层有助于处理爆发的客户,如果没有线程可以用于处理请求,这些请求会放在排队层中。+同步层很简单,并且与任何异步处理细节都无关。每个同步线程都阻塞在排队层上,等待请求到达。缺点:-排队层会发生线程切换,造成同步和上下文切换开销。可能会产生数据拷贝和缓存相干性开销。-不能把任何请求信息保存在栈上或线程专有存储中,因为请求是在另外的工作者线程中处理的。领导者/跟随者(leader/followers model)有一个线程是领导者,其余线程是在线程池中的跟随者。当请求到达时,领导者会拾取它,并从跟随者中选取一个新的领导者,然后继续处理请求。优点:+性能提高,因为不用进行线程间上下文切换。缺点:-不容易处理爆发的客户,因为不一定有显示的排队层。-实现更复杂。ACE Proactor框架使用实例首先你因该针对你应用从ACE_Service_Handler派生:#include ace/Asynch_IO.h#include ace/Message_Block.h#include ace/OS.hclass HA_Proactive_Service : public ACE_Service_Handler{private:??? ACE_Asynch_Read_Stream reader_;??? ACE_Asynch_Write_Stream writer_;public:??? ~HA_Proactive_Service()??? {??? ??? if (this-handle() != ACE_INVALID_HANDLE)??? ??? ??? ACE_OS::closesocket(this-handle());??? }??? virtual void open(ACE_HANDLE new_handle, ACE_Message_Block message_block)??? {??? ??? this-handle(new_handle);//新的socket句柄产生了,我们在析构函数里管理了它??? ??? if (this-reader_.open(*this) != 0 ||??? ??? ??? this-writer_.open(*this) != 0)??? ??? {??? ??? ??? ACE_ERROR((LM_ERROR,??? ??? ??? ??? ??? ACE_TEXT(%p\n),??? ??? ??? ??? ??? ACE_TEXT(HA_Proactive_Service open)));??? ??? ??? delete this;??? ??? ??? return;??? ??? }??? ??? //你可以在这里用this-reader_读数据,或者用this-writer_写数据??? ??? //这就是步骤的第一步(发起I/O操作)??? ??? //。。。??? ??? return;??? }??? // This method will be called when an asynchronous read??? // completes on a stream.??? virtual void handle_read_stream(const ACE_Asynch_Read_Stream::Result result)??? {??? ?? ?? //数据读完了,我取得了读到的数据mb??? ?? ?? ACE_Message_Block mb = result.message_block();??? ?? ?? //怎么处理这些数据呢,你看着办吧。??? ?? ?? //。。。??? ?? ?? return;??? }??? // This method will be called when an asynchronous write??? // completes on a stream.??? virtual void handle_write_stre
文档评论(0)