国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

在Linux上處理共享對象的同步事件(1)
2007-07-05   

在面向對象的系統中,當一個對象接收到一條消息時,可能會發生一系列的事件。通常,這些事件是以 同步(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 << ")\t : " << msg << endl;}
};
int main()
{IObjectWithEvents * powe = IObjectWithEvents::getInstance();
EventSink sink;powe->AddEventHandler(&sink);
powe->SendMessage();return 0;
}
類 EventSink 提供了這個事件處理程序的實現。主函數中給出了用于發送消息和處理事件的標準序列。
ObjectWithEvents 的典型實現如清單 3、4 所示:
清單 3. ObjectWithEvents.h
#include "common.h"
class ObjectWithEvents : public IObjectWithEvents
{
public:// We assume singleton design pattern for illustrationstatic ObjectWithEvents * ms_pObjectWithEvents;
ObjectWithEvents();
//the implementation for IObjectWithEventsvoid FireEvent();virtual bool AddEventHandler(IEventSink * pEI);virtual void SendMessage();
//Collection for maintaining eventsenum { MAX_EVENT_HANDLERS = 16, };long m_npEI;IEventSink * m_apEI[MAX_EVENT_HANDLERS];pid_t m_alPID[MAX_EVENT_HANDLERS];
};
清單 4. ObjectWithEvents.cpp
#include 
#include 
#include 
#include 
#include 
#include "ObjectWithEvents.h"
using namespace std;
ObjectWithEvents * ObjectWithEvents::ms_pObjectWithEvents = NULL;
IObjectWithEvents * IObjectWithEvents::getInstance()
{// the following commented code is for illustration only./*if (NULL == ObjectWithEvents::ms_pObjectWithEvents){ObjectWithEvents::ms_pObjectWithEvents = new ObjectWithEvents();}*/
return ObjectWithEvents::ms_pObjectWithEvents;
}
ObjectWithEvents::ObjectWithEvents() : m_npEI(0)
{
}
void ObjectWithEvents::FireEvent()
{// iterate through the collectionfor (long i = 0; i < m_npEI; i++){//Recheck for NULLif (0 != m_apEI[i]){// Fire the eventm_apEI[i]->OnEvent(m_alPID[i], "");}}
return;
}
bool ObjectWithEvents::AddEventHandler(IEventSink * pEI)
{// NULL checkif (NULL == pEI){return false;}
// check if there is space for this event handlerif (MAX_EVENT_HANDLERS == m_npEI){return false;}
// Add this event handler to the collectionm_alPID[m_npEI] = getpid();m_apEI[m_npEI++] = pEI;
return true;
}
void ObjectWithEvents::SendMessage()
{//Some processing//And then fire the event
FireEvent();
return;
}
清單 4 中的代碼可以使用下面的腳本來編譯:
g++ -g -o shm_client shm_client1.cpp ObjectWithEvents.cpp
在運行 shm_client 時,應該可以看到下面的輸出:
$ ./shm_client shm_client1.cpp:16 Message from pid(3920) :
使用共享內存:沒有事件緩存
現在,為了在共享內存中對 ObjectWithEvents 進行實例化,我們需要修改 ObjectWithEvents 的實現。

共3頁: 1 [2] [3] 下一頁

熱詞搜索:

上一篇:Linux下恢復硬盤分區數據
下一篇:如何設定執行Java的Linux安全環境(1)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
欧美日韩国产精品一区| 亚洲午夜91| 亚洲精品社区| 欧美日韩国产色综合一二三四 | 欧美日韩国产成人高清视频| 亚洲黄页视频免费观看| 欧美午夜精品久久久久免费视| 亚洲午夜在线观看视频在线| 国产欧美丝祙| 欧美成人亚洲| 亚洲欧美文学| 亚洲啪啪91| 国产一区二区三区四区hd| 久久久久9999亚洲精品| 亚洲免费电影在线观看| 国产乱码精品一区二区三区不卡| 老司机免费视频久久| 亚洲天堂成人在线视频| 韩国三级在线一区| 欧美三级视频在线观看| 久久久久久夜| 亚洲一区二区伦理| 亚洲激情六月丁香| 国产亚洲综合精品| 欧美四级剧情无删版影片| 久久精品国产精品亚洲| 宅男精品视频| 亚洲国产视频a| 国产综合自拍| 国产精品羞羞答答xxdd| 欧美日韩国产天堂| 你懂的国产精品| 久久久之久亚州精品露出| 亚洲视频你懂的| 日韩视频在线观看国产| 亚洲国产精品ⅴa在线观看| 国产午夜亚洲精品不卡| 国产精品萝li| 欧美吻胸吃奶大尺度电影| 欧美国产国产综合| 麻豆成人在线观看| 久久米奇亚洲| 久久久亚洲国产天美传媒修理工 | 亚洲视频中文字幕| 亚洲人成人77777线观看| 在线播放国产一区中文字幕剧情欧美 | 一本色道久久综合狠狠躁篇的优点 | 性8sex亚洲区入口| 亚洲无毛电影| 在线午夜精品自拍| 9色porny自拍视频一区二区| 亚洲三级观看| 亚洲伦伦在线| 一区二区三区免费看| 一本不卡影院| 亚洲一区二区精品| 亚洲欧洲av一区二区| 性欧美长视频| 久久久久久伊人| 美国三级日本三级久久99| 久久婷婷av| 欧美成人精品福利| 欧美连裤袜在线视频| 欧美日韩免费| 国产精品毛片a∨一区二区三区|国| 欧美性生交xxxxx久久久| 欧美亚洲第一区| 国产精品入口日韩视频大尺度 | 欧美日韩人人澡狠狠躁视频| 欧美日韩精品三区| 国产精品麻豆va在线播放| 国产欧美一区二区精品性| 国精品一区二区| 亚洲大胆人体视频| 日韩午夜精品视频| 亚洲免费婷婷| 久久综合色一综合色88| 欧美日韩国产123| 国产精品久久久久毛片大屁完整版 | 欧美成人亚洲成人| 欧美精品久久99| 国产精品mv在线观看| 国产在线观看91精品一区| 亚洲第一成人在线| 中文国产成人精品久久一| 午夜精品理论片| 西西裸体人体做爰大胆久久久| 久久九九国产精品怡红院| 欧美激情视频一区二区三区不卡| 欧美网站在线观看| 激情欧美一区二区三区| 99re国产精品| 久久久精品tv| 国产精品大片| 亚洲国产美女久久久久| 午夜国产一区| 欧美日韩成人在线视频| 国产精品嫩草影院av蜜臀| 亚洲国产精品99久久久久久久久| 亚洲尤物视频网| 欧美精品v日韩精品v韩国精品v| 国产欧美精品一区二区三区介绍| 亚洲高清视频在线| 久久成人免费视频| 国产精品成人av性教育| 亚洲黄色成人网| 久久久人成影片一区二区三区| 欧美视频一区二区三区在线观看| 在线成人欧美| 久久经典综合| 国产目拍亚洲精品99久久精品| 99v久久综合狠狠综合久久| 久久婷婷亚洲| 好吊色欧美一区二区三区四区| 亚洲欧美中文字幕| 国产精品高潮呻吟久久av无限| 亚洲成色777777女色窝| 久久xxxx| 国产欧美韩日| 午夜精品久久| 国产精品网站在线观看| 一区二区三区日韩欧美| 欧美国产日韩免费| 最近中文字幕日韩精品| 免费不卡亚洲欧美| 亚洲国产天堂久久综合网| 免费高清在线一区| 亚洲高清视频中文字幕| 美女啪啪无遮挡免费久久网站| 国产一区二区精品| 久久精品一区二区国产| 黑人巨大精品欧美一区二区小视频| 欧美在线日韩| 极品尤物av久久免费看| 久久久久久亚洲精品杨幂换脸| 国产日韩欧美91| 久久免费午夜影院| 亚洲国产欧美日韩| 欧美成人首页| 日韩一级黄色大片| 欧美午夜精品久久久久久超碰| 一区二区三区色| 国产精品理论片在线观看| 亚洲在线视频观看| 国产亚洲人成a一在线v站| 久久精品av麻豆的观看方式| 狠狠色丁香婷婷综合影院| 媚黑女一区二区| aa级大片欧美三级| 国产精品你懂的在线欣赏| 欧美一区三区二区在线观看| 一区福利视频| 欧美日韩成人在线视频| 午夜精品福利在线| 国产在线观看91精品一区| 免费日韩视频| 亚洲天堂免费观看| 韩国av一区| 欧美视频在线免费看| 久久激情综合网| 99国内精品久久| 国产视频在线观看一区| 欧美成年人视频网站| 亚洲免费网站| 亚洲二区视频| 国产精一区二区三区| 免费成人av| 亚洲欧美日韩在线观看a三区 | 一区三区视频| 欧美精品日韩三级| 亚洲欧美成人精品| 亚洲国产欧美一区二区三区久久| 欧美日韩高清区| 久久久99精品免费观看不卡| 亚洲免费观看高清在线观看| 国产日韩欧美| 亚洲国产精品成人| 国产乱人伦精品一区二区| 欧美成人午夜激情在线| 亚洲欧美日韩精品久久亚洲区| 在线观看日产精品| 国产精品女主播| 欧美日韩岛国| 暖暖成人免费视频| 久久精品一区二区三区不卡| 99热这里只有精品8| ●精品国产综合乱码久久久久| 国产精品毛片一区二区三区 | 亚洲国产精品成人综合色在线婷婷| 欧美日韩在线三级| 欧美超级免费视 在线| 久久精品欧美日韩| 亚洲夜间福利| 99精品国产在热久久婷婷| 在线观看的日韩av| 狠狠色伊人亚洲综合网站色| 国产精品久久久一区麻豆最新章节| 欧美a级理论片| 久久成人免费视频| 91久久精品国产91性色tv|