青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

C++博客 首頁 新隨筆 聯系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
      內存消息隊列是服務器端常用的基礎組件,他使得符合生產者-消費者模型的兩個線程或兩組線程之間的通訊看起來更加清晰,即生產者將消息壓入隊列,消費者從隊列里面取走消息并處理,具體到網絡服務器結構中,生產者線程是網絡接收線程,消費者線程是邏輯處理線程,網絡線程不停的將接收到的數據放到全局消息隊列中,邏輯處理線程不停的從全局消息隊列中取走消息并處理。
      system v消息隊列接口非常簡單,主要是msgsnd,msgrcv,每個消息的結構中都包含一個類型信息,這樣在msgrcv時就可以選擇只讀取某個類型的消息,如果類型傳為0,則不考慮類型,讀取第一個消息。根據消息類型來獲取消息是非常有用的,考慮下述簡單服務器結構:
                     client  server  dbproxy  
其中,server是主要的業務處理服務器,dbproxy是數據庫代理。以server為例,他需要處理兩方面的消息:1。來自client的消息;2。來自dbproxy的消息。定義如下枚舉:
                     enum eQueueType
                    {
                            QUEUE_TYPE_CLIENT = 1,
                            QUEUE_TYPE_WORLD  = 2, 
                     };

      當網絡線程收到來自client的消息時,將消息放到QUEUE_TYPE_CLIENT 類型的隊列中,當收到dbproxy的消息時,放到QUEUE_TYPE_WORLD中,然后設置兩個或兩組線程分別處理
QUEUE_TYPE_CLIENT 隊列和QUEUE_TYPE_WORLD隊列,結構非常清晰。在具體實現MessageQueue時,是基于ACE的消息隊列的,在內部設置了一個消息隊列的map,也就是多個消息隊列,但在接口上就是一個隊列,MessageQueue只提供了根據類型來獲取隊列中的消息,沒有提供獲取整個隊列組中第一個消息的功能。
      考慮使用全局消息隊列是我思考了一段時間才決定的,之前的做法是類似Active Object的,在ACE里就是ACE_Task類,該類即具備線程的功能,也包含了一個消息隊列,在使用時重載他的svc成員即可。對不熟悉ACE的人來說,ACE_Task在設計上比較復雜,還牽扯到隊列的操作,如此以來,提供更友好的接口就顯得很有必要,因為線程的使用大家都已經非常熟悉,消息隊列在概念上也很清晰,那么思路就是:我可以自由的創建線程,在線程里從全局消息隊列中讀取消息。看似和ACE_Task沒有根本區別,其實全局消息隊列的C風格的接口,而不是派生的方式,大大降低了復雜度。

        代碼貼上,方便以后查閱:
MessageQueue.h

#pragma once

#include 
<map>
#include 
<ace/Synch.h>
#include 
<ace/Message_Queue.h>
#include 
<ace/Singleton.h>

using std::map;

class MessageQueue
{
public:
    MessageQueue(
void);
    
~MessageQueue(void);

public:
    
static MessageQueue* Instance();
    ACE_Message_Block
* GetMessage(int nType);
    ACE_Message_Block
* GetMessage(int nType,int nSeconds );//超時nSeconds秒
    bool PutMessage(int nType,ACE_Message_Block* pMsg);
    
bool PutMessage(int nType,ACE_Message_Block* pMsg,int nSeconds);//超時nSeconds秒
    
protected:
    
//獲取某類型的消息隊列,沒有則創建
    ACE_Message_Queue<ACE_MT_SYNCH>* GetQueue(int nType);
private:
    map
<int,ACE_Message_Queue<ACE_MT_SYNCH>* > m_QueueMap; 
    ACE_Thread_Mutex        m_QueueMapMutex;
}
;

typedef ACE_Singleton
<MessageQueue,ACE_Thread_Mutex>    MessageQueueSingleton;


MessageQueue.cpp

#include 
<cassert>
#include 
<ace/Guard_T.h>

#include 
"MessageQueue.h"
// MessageQueue.cpp : 定義控制臺應用程序的入口點。
//


MessageQueue::MessageQueue(
void)
{
}


MessageQueue::
~MessageQueue(void)
{
    ACE_GUARD(ACE_Thread_Mutex,g,m_QueueMapMutex);
    
for (map<int,ACE_Message_Queue<ACE_MT_SYNCH>* >::iterator iter = m_QueueMap.begin(); iter != m_QueueMap.end();++iter)
    
{
        ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = iter->second;
        pQueue
->close();
        delete pQueue;
    }

    m_QueueMap.clear();
}


MessageQueue
* MessageQueue::Instance()
{
    
return MessageQueueSingleton::instance();
}


ACE_Message_Block
* MessageQueue::GetMessage( int nType )
{
    ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = GetQueue(nType);

    ACE_Message_Block
* pMsg = NULL;
    
int nRet = pQueue->dequeue(pMsg);

    
if (nRet != -1)
    
{
        
return pMsg;
    }

    
else
    
{
        
return NULL;
    }

}


ACE_Message_Block
* MessageQueue::GetMessage( int nType,int nSeconds )
{
    assert( nSeconds 
> 0);
    ACE_Time_Value timeout 
= ACE_OS::gettimeofday();
    timeout 
+= nSeconds;

    ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = GetQueue(nType);            

    ACE_Message_Block
* pMsg = NULL;
    
int nRet = pQueue->dequeue(pMsg,&timeout);

    
if (nRet != -1)
    
{
        
return pMsg;
    }

    
else
    
{
        
return NULL;
    }

}


bool MessageQueue::PutMessage( int nType,ACE_Message_Block* pMsg )
{
    ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = GetQueue(nType);
    
int nRet = pQueue->enqueue(pMsg);

    
return nRet != -1;
}


bool MessageQueue::PutMessage( int nType,ACE_Message_Block* pMsg,int nSeconds )
{
    assert( nSeconds 
> 0);
    ACE_Time_Value timeout 
= ACE_OS::gettimeofday();
    timeout 
+= nSeconds;

    ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = GetQueue(nType);
    
int nRet = pQueue->enqueue(pMsg,&timeout);

    
return nRet != -1;
}


ACE_Message_Queue
<ACE_MT_SYNCH>* MessageQueue::GetQueue( int nType )
{
    assert( nType 
>= 0 );
    ACE_GUARD_RETURN(ACE_Thread_Mutex,g,m_QueueMapMutex,NULL);

    
if (m_QueueMap.find(nType) != m_QueueMap.end())
    
{
        
return m_QueueMap[nType];
    }

    
else
    
{
        ACE_Message_Queue
<ACE_MT_SYNCH>* pQueue = new ACE_Message_Queue<ACE_MT_SYNCH>();
        m_QueueMap[nType] 
= pQueue;
        
return pQueue;
    }

}

test.cpp
#include "MessageQueue.h"
#include 
<iostream>
#include 
<ace/OS.h>
using namespace std;

enum eQueueType
{
    QUEUE_TYPE_CLIENT 
= 1,
    QUEUE_TYPE_WORLD  
= 2,    
}
;

int main(int argc, char* argv[])
{

    MessageQueue
* pQueue = MessageQueue::Instance();

    ACE_Message_Block
* pClientMsg = new ACE_Message_Block(100);
    pClientMsg
->copy("client msg");
    pQueue
->PutMessage(QUEUE_TYPE_CLIENT,pClientMsg);


    ACE_Message_Block
* pWorldMsg = new ACE_Message_Block(100);
    pWorldMsg
->copy("world msg");
    pQueue
->PutMessage(QUEUE_TYPE_WORLD,pWorldMsg);


    ACE_Message_Block
* pTemp = NULL;
    pTemp 
= pQueue->GetMessage(QUEUE_TYPE_CLIENT);
    cout 
<< pTemp->rd_ptr() << endl;

    pTemp 
= pQueue->GetMessage(QUEUE_TYPE_WORLD);
    cout 
<< pTemp->rd_ptr() << endl;

    cout 
<< "begin time : " << ACE_OS::time(NULL) << endl;
    pTemp 
= pQueue->GetMessage(QUEUE_TYPE_CLIENT,10);
    cout 
<< "end time : " << ACE_OS::time(NULL) << endl;
    
if (pTemp == NULL)
    
{
        cout 
<< "time out when get client msg" << endl;
    }


    
return 0;
}

posted on 2010-09-19 01:01 true 閱讀(2264) 評論(1)  編輯 收藏 引用 所屬分類: ACE游戲開發

Feedback

# re: 仿照system v消息隊列的內存消息隊列[未登錄] 2010-09-20 16:15 vincent
贊一個:)ace_task是個好玩意,有許多可以借鑒的東西  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产亚洲综合在线| 亚洲视频福利| 久久亚洲一区二区三区四区| 免费成人小视频| 激情六月婷婷久久| 美女性感视频久久久| 一本色道久久88综合亚洲精品ⅰ| 午夜视频一区在线观看| 欧美国产一区二区| 红杏aⅴ成人免费视频| 午夜精品一区二区三区在线视| 欧美激情精品久久久久久久变态| 99视频一区二区三区| 夜夜爽www精品| 久久国产精品色婷婷| 国产精品入口福利| 亚洲图片欧洲图片日韩av| 亚洲国产欧美日韩精品| 久久精品日产第一区二区三区| 国产日韩欧美亚洲| 久久久久在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 国产一区二区主播在线| 久久国产精品久久w女人spa| 欧美中文字幕在线视频| 国产一区久久久| 久久久久久久久伊人| 久久激情一区| 国产午夜亚洲精品理论片色戒 | 亚洲国产精品高清久久久| 久久国产精品72免费观看| 久久成人资源| 亚洲国产精品嫩草影院| 最新国产の精品合集bt伙计| 欧美日韩性生活视频| 欧美在线观看视频在线| 亚洲欧美综合v| 国产午夜精品一区二区三区视频 | 欧美亚洲网站| 亚洲欧美www| 在线欧美日韩| 一区二区三欧美| 亚洲激情av在线| 欧美日韩在线不卡一区| 亚洲欧洲一区二区天堂久久| 亚洲日本精品国产第一区| 国产精品视频网| 美女网站在线免费欧美精品| 女女同性女同一区二区三区91| 在线成人激情黄色| 最新日韩在线视频| 国产美女精品免费电影| 欧美www视频| 麻豆freexxxx性91精品| 国产精品99久久99久久久二8| 亚洲欧美综合另类中字| 影音先锋中文字幕一区| 99re6热只有精品免费观看 | 欧美专区日韩专区| 亚洲黄网站黄| 亚洲资源av| 欧美中文在线免费| 欧美精品videossex性护士| 西西人体一区二区| 男人插女人欧美| 久久精品一区| 欧美视频久久| 欧美黑人在线观看| 国产视频一区在线观看| 亚洲精品免费网站| 亚洲国产成人精品女人久久久| 亚洲免费在线观看视频| 亚洲精品国产精品国自产观看| 午夜激情综合网| 亚洲一区二区伦理| 国产日韩欧美一二三区| 欧美日韩情趣电影| 欧美1区3d| 国内成人精品一区| 亚洲欧美久久久| 亚洲一区二区三区乱码aⅴ| 久久午夜视频| 欧美在线亚洲| 国产精品久久久久久久久果冻传媒 | 久久精品国产亚洲精品| 亚洲欧美一区二区原创| 欧美日韩欧美一区二区| 亚洲国产精品电影| 亚洲黄网站黄| 巨胸喷奶水www久久久免费动漫| 久久精品91| 国产亚洲福利一区| 欧美亚洲综合久久| 久久久999精品免费| 国产精品一页| 欧美一区二区私人影院日本| 亚洲在线成人精品| 国产精品嫩草99av在线| 免费日韩av电影| 裸体丰满少妇做受久久99精品| 欧美岛国激情| 欧美日韩久久不卡| 亚洲精品自在在线观看| 99在线精品视频| 欧美二区在线看| 亚洲欧洲在线播放| 妖精成人www高清在线观看| 欧美精品一区二区精品网| 亚洲精品国产精品国自产观看浪潮| 亚洲精品视频在线观看网站| 欧美激情视频给我| 亚洲天堂成人在线观看| 性欧美精品高清| 精品999久久久| 欧美成人精品一区| 国产欧美日韩91| 国产日韩欧美精品综合| 欧美+日本+国产+在线a∨观看| 国产午夜亚洲精品不卡| 久久久亚洲精品一区二区三区| 男女视频一区二区| 国产精品入口夜色视频大尺度 | 蜜臀va亚洲va欧美va天堂| 在线亚洲一区二区| 国产精品jvid在线观看蜜臀| 亚洲一区视频在线| 久久久久成人精品| 亚洲乱码国产乱码精品精天堂| 欧美日韩国产免费观看| 日韩视频在线观看国产| 欧美在线视频不卡| 亚洲肉体裸体xxxx137| 国产精品久久久久久久app| 欧美中文在线观看国产| 亚洲经典三级| 久久精品99无色码中文字幕| 亚洲精品在线二区| 欧美日韩伦理在线免费| 西瓜成人精品人成网站| 欧美一区91| 欲色影视综合吧| 欧美视频一二三区| 久久精品国产清高在天天线| 亚洲国产精品成人| 久久久美女艺术照精彩视频福利播放 | 亚洲精品午夜| 久久精品理论片| 亚洲精品国产精品久久清纯直播 | 亚洲精品资源美女情侣酒店| 香蕉成人伊视频在线观看| 国产真实久久| 欧美日韩在线直播| 另类天堂视频在线观看| 亚洲综合精品一区二区| 亚洲人人精品| 欧美成人免费观看| 久久免费观看视频| 香蕉久久夜色精品国产| 一本色道久久综合亚洲精品婷婷| 在线播放中文字幕一区| 国产精品影视天天线| 欧美视频一区二区三区四区| 欧美成人亚洲成人日韩成人| 久久久精品一区| 欧美在线看片| 午夜国产欧美理论在线播放| 一本色道久久综合亚洲精品婷婷 | 美女露胸一区二区三区| 欧美亚洲一区二区在线| 亚洲天堂免费观看| 日韩一级不卡| 亚洲精选一区二区| 亚洲国产精品久久久久秋霞不卡 | 欧美在线首页| 午夜视频一区| 先锋影音一区二区三区| 欧美午夜宅男影院在线观看| 99国产一区二区三精品乱码| 亚洲国产成人精品久久| 蜜桃久久av| 欧美va亚洲va香蕉在线| 老司机午夜精品视频在线观看| 久久国产毛片| 久久久精品免费视频| 久久久99精品免费观看不卡| 欧美一区二区三区四区高清| 亚洲一区二区三区在线播放| 亚洲系列中文字幕| 性欧美18~19sex高清播放| 午夜精品在线观看| 久久久久88色偷偷免费| 乱码第一页成人| 亚洲国产91| 日韩亚洲欧美中文三级| 亚洲欧美另类在线观看| 欧美一区二区精品| 久久一日本道色综合久久| 免费日韩av电影| 欧美日韩激情小视频| 欧美午夜视频网站|