//file: main.cpp
//author: StoneJiang <jiangtao> http://www.tao-studio.net</jiangtao>
//date: 2008-12-14
//desc: Integrating Proactor and Reactor Events on Windows
#include "ace/Proactor.h"
#include "ace/WIN32_Proactor.h"
#include "ace/Atomic_Op.h"
#include "ace/OS_NS_unistd.h"
#include "ace/Reactor.h"
#include "ace/Time_Value.h"
class Timeout_Handler : public ACE_Handler, public ACE_Event_Handler
{
// = TITLE
// Generic timeout handler.
public:
Timeout_Handler (void)
{
}
// This is called by the Proactor. This is declared in ACE_Handler.
virtual void handle_time_out (const ACE_Time_Value &tv,
const void *arg)
{
// Print out when timeouts occur.
ACE_DEBUG ((LM_DEBUG, "(%t|%P) %d timeout occurred for %s @ %d.\n",
++count_,
(char *) arg,
tv.sec ()));
// Since there is only one thread that can do the timeouts in
// Reactor, lets keep the handle_timeout short for that
// thread.
if (ACE_OS::strcmp ((char *) arg, "Proactor") == 0)
// Sleep for a while
ACE_OS::sleep (1);
}
// This method is declared in ACE_Event_Handler.
virtual int handle_timeout (const ACE_Time_Value &tv,
const void *arg)
{
this->handle_time_out (tv, arg);
return 0;
}
private:
ACE_Atomic_Op <ace_thread_mutex style="color: #0000ff">int> count_;
};
<span style="color: #0000ff">int</span>
ACE_TMAIN (<span style="color: #0000ff">int</span>, ACE_TCHAR *[])
{
ACE_DEBUG ((LM_DEBUG, "<span style="color: #8b0000">(%t|%P) work starup\n</span>"));
ACE_Proactor::close_singleton ();
ACE_WIN32_Proactor *impl = <span style="color: #0000ff">new</span> ACE_WIN32_Proactor (0, 1);
ACE_Proactor::instance (<span style="color: #0000ff">new</span> ACE_Proactor (impl, 1), 1);
ACE_Reactor::instance ()->register_handler(impl, impl->get_handle ());
Timeout_Handler handler;
<span style="color: #008000">// Register a 2 second timer.</span>
ACE_Time_Value foo_tv (2);
<span style="color: #0000ff">if</span> (ACE_Proactor::instance()->schedule_timer (handler,
(<span style="color: #0000ff">void</span> *) "<span style="color: #8b0000">Proactor</span>",
ACE_Time_Value::zero,
foo_tv) == -1)
ACE_ERROR_RETURN ((LM_ERROR, "<span style="color: #8b0000">%p\n</span>", "<span style="color: #8b0000">schedule_timer</span>"), -1);
<span style="color: #008000">// Register a 3 second timer.</span>
ACE_Time_Value bar_tv (3);
<span style="color: #0000ff">if</span> (ACE_Reactor::instance ()->schedule_timer (&handler,
(<span style="color: #0000ff">void</span> *) "<span style="color: #8b0000">Reactor</span>",
ACE_Time_Value::zero,
bar_tv) == -1)
ACE_ERROR_RETURN ((LM_ERROR, "<span style="color: #8b0000">%p\n</span>", "<span style="color: #8b0000">schedule_timer</span>"), -1);
ACE_Reactor::instance()->run_event_loop();
ACE_Reactor::instance ()->remove_handler (impl,
ACE_Event_Handler::DONT_CALL);
ACE_DEBUG ((LM_DEBUG, "<span style="color: #8b0000">(%t|%P) work complete\n</span>"));
<span style="color: #0000ff">return</span> 0;
}</ace_thread_mutex>
完成源代码下载download
分享到:
相关推荐
Proactor-Reactor 模式详解 Proactor-Reactor 模式是高性能服务器设计的核心思想之一,它们都是基于 I/O 多路复用的技术实现的。下面我们来详细了解 Proactor-Reactor 模式的设计思想和实现机理。 问题背景 在...
在并发系统设计中,Proactor和Reactor模式是两种常用的设计模式,它们主要用来处理I/O操作的事件派发和分离。这两种模式都是为了提高系统的并发能力,优化资源利用,但它们在处理I/O事件的方式上有所不同。 首先,...
Reactor 和 Proactor 模式是两种常见的事件处理模式,在网络编程中广泛应用于设计高效、可靠的并发和网络应用程序。在本文中,我们将详细介绍 Reactor 和 Proactor 模式的概念、特点、优缺点,以及在网络编程中的...
本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解
本文旨在详细介绍这些I/O模型,并着重解析Reactor模式与Proactor模式的设计思想及其应用场景。 #### 二、同步阻塞I/O (Blocking I/O) 同步阻塞I/O是最基本且最直观的I/O处理方式。在这种模式下,应用程序发出I/O...
ACE_Proactor是ACE库中的一个核心组件,它提供了一种异步事件处理机制,使得开发者可以编写非阻塞的、高性能的网络应用。这个压缩包包含的是一组使用ACE_Proactor实现TCP通信的示例代码,我们可以从这些文件中学习到...
ACE_Proactor是一个高级事件处理库,它为C++程序员提供了异步I/O操作的抽象,包括TCP协议的网络通信。这个示例代码是关于如何利用ACE_Proactor库来实现TCP协议的客户端和服务器端通信。下面我们将深入探讨相关知识点...
`Proactor`模式是一种异步I/O处理模式,与传统的`Reactor`模式(同步I/O)相对。在`Reactor`模式中,I/O操作完成后,事件多路分离器会通知处理器,然后处理器执行实际的读写操作。而在`Proactor`模式中,处理器发起...
C和C++实现和封装不同的网络 IO 模型源码(如 epoll、reactor、io_uring 和 proactor).zip 【说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请...
**Windows下的IOCP(I/O完成端口)与ACE Proactor框架** IOCP(I/O完成端口,Input/Output Completion Port)是Windows操作系统提供的一种高效、可扩展的异步I/O模型。它允许应用程序处理大量的并发I/O操作,特别...
Reactor 负责维护事件处理器与事件类型的关联,并在事件发生时调用相应的 "handle_" 方法。 使用 ACE Reactor 的基本步骤包括: 1. 创建事件处理器子类,继承自 ACE_Event_Handler,实现对应事件的 "handle_" 方法...
Proactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events.pdf
C++高性能并发编程之proactor模式应用实例,应用于网络编程领域,包含一下几个部分: 1 服务器端程序:一个server代码展示如何使用现代C++11编程高并发代码,一个Makefile文件 2 客户端程序:一个客户端代码展示如何...
Proactor模式是ACE库中提供的一种异步事件处理模型,它允许程序在非阻塞方式下处理I/O操作,提高了系统的并发处理能力。本封装主要目的是使开发者能够在不直接接触ACE底层细节的情况下,利用Proactor模式实现高效的...
很全面的ACE服务器,包括proactor、reactor模式
Proactor模式与Reactor模式类似,也是事件驱动的,但其主要区别在于它是异步操作的。在Proactor模式中,I/O操作不是由事件处理器直接完成,而是由操作系统在后台异步执行,完成后通过回调函数通知处理器。这样,...
在Reactor模式中,一个中心对象(Reactor)负责监听多个套接字的事件,并根据事件类型分派相应的处理器来处理。这种模式使得服务器可以同时处理多个连接,极大地提高了并发能力。在HTTP服务器中,Reactor模式通常与...
与传统的异步I/O(如回调函数)不同,Proactor模式通过事件通知机制来处理I/O完成,而不是等到I/O操作完成后回调。当I/O操作准备好时,操作系统会将完成信号放入完成队列,由事件循环检测并处理这些事件,这样可以...
在IT行业中,Reactor模式是一种常见的并发编程设计模式,它...在实践中,你还可以进一步探讨如何利用多线程、异步IO或者其他并发模型来增强Reactor的性能,例如使用Proactor模式(异步事件驱动)或者结合Actor模型等。