为了顺应当前形势和更好的发展,黑基网已于9月19日正式更名为【安基网】,域名更换为www.safebase.cn,请卸载旧的APP并安装新的APP,给您带来不便,敬请理解!谢谢

黑基Web安全攻防班
安基网 首页 IT技术 网络管理 查看内容

在Linux上处理共享对象的同步事件

2005-6-9 13:11| 投稿: Linux

摘要:   在面向对象的系统中,当一个对象接收到一条消息时,可能会发生一系列的事件。通常,这些事件是以 同步(synchronous) 模式处理的:调用进程或向这个对象发送消息的线程在发送消息...
  在面向对象的系统中,当一个对象接收到一条消息时,可能会发生一系列的事件。通常,这些事件是以 同步(synchronous) 模式处理的:调用进程或向这个对象发送消息的线程在发送消息调用完成之前都会接收并处理一系列事件。然而,如果产生这些事件的对象是由多个进程进行共享并且保存在共享内存中时,情况就稍微有些不同了。  本文将使用两种 C++ 设计模式来详细介绍这种情况,并使用一些样例代码来展示这种解决方案(这些样例代码可以从本文 下载 一节中获得):我们将简要介绍不使用共享内存的样例代码。 使用第一种设计模式来修改这些代码,让其使用共享内存。 然后阐述如何使用第二种设计模式来实现进程间通信(IPC)。   您可以在任何机器体系架构、操作系统和编译器上应用这两种设计模式中的概念。对于本文来说,我们使用的是 RedHat Linux 7.1 for 32-bit x86 Intel® 体系架构的发行版;使用 GNU C++ compiler version 3.2.3 编译器及其相关工具来编译并测试样例程序。  不使用共享内存  下面让我们开始介绍这个样例程序,首先是不使用共享内存的程序:  清单 1. common.h#ifndef __COMMON_H__#define __COMMON_H__class IObjectWithEvents{public:class IEventSink{public:virtual void OnEvent(pid_t pid, const char * msg) = 0;};static IObjectWithEvents * getInstance();virtual bool AddEventHandler(IEventSink * pEI) = 0;virtual void SendMessage() = 0;};#endif //__COMMON_H__  接口类 IObjectWithEvents 包含了一个内嵌的接口类 IEventSink,它定义了 OnEvent() 方法。这个事件处理程序接收一个发送者的 id 和一个字符串消息。getInstance() 方法返回对共享内存中对象的引用,AddEventHandler() 注册一个事件处理程序,SendMessage() 向这个对象发送一条消息。由于不需要引用共享内存,所以可以像清单 2 中那样来使用 IObjectWithEvents:  清单 2. shm-client1.cpp#include#include#include#include "common.h"#define HERE __FILE__ << ":" << __LINE__ << " "using namespace std;class EventSink : public IObjectWithEvents::IEventSink{public:  void OnEvent(pid_t pid, const char * msg)  {   cout << HERE << "Message from pid(" << pid << ")   : "<< msg << endl;}};int main(){IObjectWithEvents * powe = IObjectWithEvents::getInstance();EventSink sink;powe->AddEventHandler(&sink);powe->SendMessage();return 0;}

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部