网站大量收购闲置独家精品文档,联系QQ:2885784924
  1. 1、本文档共60页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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.h class 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)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档