创建一个可正常结束的Proactor服务器

这是APG上关于Proactor使用的例子,去掉了trace信息,做了一点小修改:

#include <ace/Os_main.h>

#include <ace/Asynch_Acceptor.h>

#include <ace/Proactor.h>

#define LISTEN_PORT 5222

class HA_Proactive_Service : public ACE_Service_Handler

{

public:

       ~HA_Proactive_Service ()

       {

              if (this->handle () != ACE_INVALID_HANDLE)

                     ACE_OS::closesocket (this->handle ());

       }

       virtual void open (ACE_HANDLE h, ACE_Message_Block&)

       {

              this->handle (h);

              if (this->reader_.open (*this) != 0 || this->writer_.open (*this) != 0   )

              {

                     delete this;

                     return;

              }

              ACE_Message_Block *mb;

              ACE_NEW_NORETURN (mb, ACE_Message_Block (1024));

              if (this->reader_.read (*mb, mb->space ()) != 0)

              {

                     mb->release ();

                     delete this;

                     return;

              }

       }

       virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)

       {

              ACE_Message_Block &mb = result.message_block ();

              if (!result.success () || result.bytes_transferred () == 0)

              {

                     mb.release ();

                     delete this;

              }

              else

              {

                     ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Received Data : %c/n"), *mb.rd_ptr()));

                     mb.release();

                     ACE_Message_Block *new_mb;

                     ACE_NEW_NORETURN (new_mb, ACE_Message_Block (1024));

                     this->reader_.read (*new_mb, new_mb->space ());

              }

       }

       virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)

       { result.message_block ().release (); }

private:

       ACE_Asynch_Read_Stream reader_;

       ACE_Asynch_Write_Stream writer_;

};

class HA_Proactive_Acceptor : public ACE_Asynch_Acceptor<HA_Proactive_Service>

{

};

int ACE_TMAIN (int, ACE_TCHAR *[])

{

       ACE_INET_Addr listen_addr( LISTEN_PORT );

       HA_Proactive_Acceptor aio_acceptor;

       if (0 != aio_acceptor.open (listen_addr, 0, 0, 5, 1, 0, 0))

              ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p/n"), ACE_TEXT ("acceptor open")), 1);

       ACE_Proactor::instance ()->proactor_run_event_loop ();

       return 0;

}

程序在5222端口上监听,对于每个已建立的连接,服务器将所有收到的数据打印到控制台上。这就是整个程序所实现的功能。

但是这个程序存在一个很大的问题:没有办法正常结束。当运行这个程序后,只能强制结束这个进程,因为程序没有提供从proactor事件循环中退出来的方法。

让程序能够正常退出是很有必要的,比如在进行内存泄漏的检测时,如果程序没有办法正常退出,那么内存泄漏的检测工作将很难进行。

为了实现能够正常关闭程序的目的,需要稍微修改一下上面的程序实现。

这次程序将会有两个线程在运行,一个是Proactor事件循环线程,另一个则为控制线程。在控制线程中,要能够关闭Proactor线程,然后将程序干净地退出。

得益于ACE强大的封装,所做的改动并不大:

class ProactorThread : public ACE_Task_Base

{

public:

       int open()

       {

              return this->activate();

       }

       int close()

       {

              ACE_Proactor::instance()->proactor_end_event_loop();

              this->wait();

              return 0;

       }

       virtual int svc()

       {

              ACE_INET_Addr listen_addr( LISTEN_PORT );

              HA_Proactive_Acceptor aio_acceptor;

              if (0 != aio_acceptor.open (listen_addr, 0, 0, 5, 1, 0, 0))

                     ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p/n"), ACE_TEXT ("acceptor open")), 1);

              ACE_Proactor::instance ()->proactor_run_event_loop ();

              ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Thread ended/n")));

              return 0;

       }

};

int ACE_TMAIN (int, ACE_TCHAR *[])

{

       ProactorThread thread;

       thread.open();

       int x;

       std::cin >> x;

       thread.close();

       return 0;

}

仅仅只是添加了一个新的类,用于封装Proactor事件循环线程,另外修改了程序的主函数。这次程序将首先创建一个Proactor事件循环线程,然后主线程等待用户输入任意数后结束Proactor线程,在Proactor线程正常退出后主线程退出。

注意这里有两个要点:

1.当执行proactor_end_event_loop()之后,Proactor线程是从proactor_run_event_loop()处退出,所以会接着执行下面的代码,打印出” Thread ended”信息。

2.主线程必须使用wait()等待Proactor线程正常结束后再退出,否则如果主线程退出后,Proactor线程仍有一些资源释放工作未完成,那么就会存在资源未正确释放的问题。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《企业级 VMware vSphere 6.7虚拟化技术配置与管理》课程共分为“上集”和“下集”两部分,本套视频为“下集”部分,“上集”部分已经对VMware vSphere 6.7的计算资源、网络资源、存储资源、虚拟机配置与管理等进行了详细讲解,“下集”部分以“上集”为基础进行技术延伸,全面对vMotion、DRS、HA、FT、性能监控、VDP备份等特性进行理论讲解和实战配置。 通过本课程学习,可以全面掌握vMotion、资源池、DRS、HA、FT、VDP、监控等高可用性运维技能。 《企业级 VMware vSphere虚拟化技术配置与管理》下集部分具体课程章节如下。 第1章 《VMware vSphere 6.7 vMotion配置与管理》主要内容本章我们详细介绍了冷迁移、通过 vMotion 迁移、通过 Storage vMotion 迁移、CPU 兼容性和 EVC、在 vSphere Client中迁移已关闭电源或已挂起的虚拟机、将开机状态的虚拟机迁移至新计算资源和存储、关于迁移兼容性检查等内容。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第2章 《VMware vSphere 6.7 资源和DRS配置与管理》主要内容本章我们主要讲解了CPU虚拟化资源管理知识、内存虚拟化资源管理知识、存储虚拟化资源管理知识、资源池、DRS群集、Storage I/O Control、科学合理的进行资源分配相关理论和操作。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第3章 《VMware vSphere 6.7 HA配置与管理》主要内容本章我们主要讲解了业务连续性和最小化停机时间、vSphere HA 的工作原理、vSphere HA 准入控制、vSphere HA 互操作性等知识。通过实践操作,可以掌握创建 vSphere HA 群集,配置 vSphere HA群集,配置 Proactive HA。为了提高vCenter Server的高可用性,讲解了vCenter High Availability知识。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第4章 《VMware vSphere 6.7 FT配置与管理》主要内容本章我们从理论上讲解了Fault Tolerance 的工作原理、Fault Tolerance工作用例、Fault Tolerance 环境要求、限制和许可、Fault Tolerance 互操作性。以理论为基础,实践了打开Fault Tolerance功能、测试Fault Tolerance故障切换、迁移辅助虚拟机、挂起Fault Tolerance、恢复Fault Tolerance、关闭Fault Tolerance等内容。最后总结了使用Fault Tolerance的科学做法、Fault Tolerance的故障排除方法。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第5章 《VMware vSphere Data Protection(VDP)》 主要内容本章我们从理论上讲解vSphere Data Protection的基本功能、体系架构。演示了VDP的安装和配置,讲解了怎样正确使用VDP以及使用VDP进行管理备份,自动备份验证,管理恢复,复制作业,文件级恢复,紧急恢复,VDP代理等相关功能,最后针对VDP常见故障进行了总结分析。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第6章 《VMware vSphere 6.7 监控和性能》 主要内容本章我们从理论上讲解了vSphere监控、性能、日志等相关基本知识。实践操作了使用性能图表监控清单对象、监控事件和警报、系统日志文件的配置。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 企业级 VMware vSphere 6.7虚拟化技术配置与管理(上集)视频课程:https://edu.csdn.net/course/detail/35162企业级 VMware vSphere 6.7虚拟化技术配置与管理(下集)视频课程:https://edu.csdn.net/course/detail/35171

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值