设为首页 加入收藏

TOP

服务器设计笔记(5)-----分享几个线程安全的容器
2012-12-02 23:04:25 来源: 作者: 【 】 浏览:363
Tags:服务器 设计 笔记 -----分享 线程 安全 容器

      首先是 队列 PipeList       

 1/* 2 * PipeList.h 3 * 4 *  Created on: Aug 28, 2012 5 *      Author: archy_yu 6*/ 7 8#ifndef PIPELIST_H_ 9#define PIPELIST_H_1011 #include <list>1213 #include "Mutex.h"14 #include "GameUtil.h"151617 template <class CObject>18class PipeList19{20     friend class Player;21     friend class EvenPlayer;22     friend class ClientPlayer;23public:2425    PipeList(){}2627virtual ~PipeList(){}2829/**************************************************************30 *31 *be careful32 *33 * ***********************************************************/3435int pop(CObject &_arg,BOOL swap = TRUE)36    {37if(this->_read_list.empty())38        {3940if(swap == FALSE)41            {42return -1;43            }4445             Auto_Mutex _auto_mutex(this->_mutex);46if(!this->_write_list.empty())47            {48this->_write_list.swap(this->_read_list);49            }50else51            {52return -1;53            }54        }55         _arg = this->_read_list.front();56this->_read_list.pop_front();57return0;58    }5960void push(CObject &_arg)61    {62         Auto_Mutex _auto_mutex(this->_mutex);63this->_write_list.push_back(_arg);64    }6566int Size()67    {68returnthis->_list.size();69    }7071private:72void swap()73    {74if(!this->_read_list.empty())75        {76return;77        }78         Auto_Mutex _auto_mutex(this->_mutex);79this->_write_list.swap(this->_read_list);80    }8182private:8384     std::list<CObject> _write_list;8586     std::list<CObject> _read_list;8788    Mutex _mutex;8990};9192#endif /* DUPLEXLIST_H_ */

     线程安全的 Map

     

/* * PipeList.h * *  Created on: Aug 28, 2012 *      Author: archy_yu */#ifndef TSMAP_H_#define TSMAP_H_#include <map>#include <ext/hash_map>usingnamespace __gnu_cxx;template <class Key,class CObject>class TsMap{public:    TsMap(){}    virtual ~TsMap(){}    int find(Key key,CObject &_args)    {        Auto_R_Mutex _auto_mutex(this->_mutex);        if(this->_map.count(key) <= 0)        {            return -1;        }        _args = this->_map.find(key)->second ;        return0;    }    int bind(Key key,CObject _args)    {        Auto_W_Mutex _auto_mutex(this->_mutex);        this->_map[key] = _args;        return0;    }    int unbind(Key key)    {        Auto_W_Mutex _auto_mutex(this->_mutex);        this->_map.erase(key);        return0;    }    int Size()    {        Auto_R_Mutex _auto_mutex(this->_mutex);        returnthis->_map.size();    }private:    std::map<Key,CObject> _map;    RW_Mutex _mutex;};template <class Key,class CObject>class TsHash_Map{public:    TsHash_Map(){}    virtual ~TsHash_Map(){}    int find(Key _key,CObject &_object)    {        Auto_R_Mutex _auto_mutex(this->_mutex);        if(this->_map.count(_key) <= 0)        {            return -1;        }        _object = this->_map.find(_key)->second;        return0;    }    int bind(Key _key,CObject _object)    {        Auto_W_Mutex _aotu_mutex(this->_mutex);        this->_map[_key] = _object;        return0;    }    int unbind(Key _key)    {        Auto_W_Mutex _auto_mutex(this->_mutex);        this->_map.erase(_key);        return0;    }    int Size()    {        Auto_R_Mutex _auto_mutex(this->_mutex);        returnthis->_map.size();    }private:    hash_map<Key,CObject> _map;    RW_Mutex _mutex;};#endif

   一些基础类

   

class Auto_R_Mutex{public:    Auto_R_Mutex(RW_Mutex &rw_mutex);    virtual ~Auto_R_Mutex();private:    Auto_R_Mutex();    RW_Mutex *_mutex;};class Auto_W_Mutex{public:    Auto_W_Mutex(RW_Mutex &rw_mutex);    virtual ~Auto_W_Mutex();private:    Auto_W_Mutex();    RW_Mutex *_mutex;};Auto_Mutex::Auto_Mutex(Mutex &mutex){    this->_mutex = &mutex;    this->_mutex->lock();}Auto_Mutex::~Auto_Mutex(){    this->_mutex->Release();}Auto_R_Mutex::Auto_R_Mutex(RW_Mutex &rw_mutex){    this->_mutex = &rw_mutex;    this->_mutex->rLock();}Auto_R_Mutex::~Auto_R_Mutex(){    this->_mutex->rRelease();}Auto_W_Mutex::Auto_W_Mutex(RW_Mutex &rw_mutex){    this->_mutex = &rw_mutex;    this->_mutex->wLock();}Auto_W_Mutex::~Auto_W_Mutex(){    this->_mutex->wRelease();}

    

class RW_Mutex{public:    RW_Mutex();    virtual ~RW_Mutex();    int rLock();    int rRelease();    int wLock();    int wRelease();private:    pthread_rwlock_t _map_lock;};class Mutex{public:    Mutex();    virtual ~Mutex();    intlock();    int Release();private:    pthread_mutex_t _lock;};RW_Mutex::RW_Mutex(){    pthread_rwlock_init(&_map_lock,NULL);}RW_Mutex::~RW_Mutex(){    pthread_rwlock_destroy(&_map_lock);}int RW_Mutex::rLock(){    pthread_rwlock_rdlock(&_map_lock);    return0;}int RW_Mutex::rRelease(){    pthread_rwlock_unlock(&_map_lock);    return0;}int RW_Mutex::wLock(){    pthread_rwlock_wrlock(&_map_lock);    return0;}int RW_Mutex::wRelease(){    pthread_rwlock_unlock(&_map_lock);    return0;}Mutex::Mutex(){    pthread_mutex_init(&this->_lock,NULL);}Mutex::~Mutex(){    pthread_mutex_destroy(&this->_lock);}int Mutex::lock(){    pthread_mutex_lock(&this->_lock);    return0;}int Mutex::Release(){    pthread_mutex_unlock(&this->_lock);    return0;}

 

 

  

  

 

  

   

 

  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++类设计小结 下一篇服务器设计笔记(4)-----客户端通..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: