服务器设计笔记(5)-----分享几个线程安全的容器
2012-10-18 10:21
344 查看
首先是 队列 PipeList
线程安全的 Map
一些基础类
/* * PipeList.h * * Created on: Aug 28, 2012 * Author: archy_yu */ #ifndef PIPELIST_H_ #define PIPELIST_H_ #include <list> #include "Mutex.h" #include "GameUtil.h" template <class CObject> class PipeList { friend class Player; friend class EvenPlayer; friend class ClientPlayer; public: PipeList(){} virtual ~PipeList(){} /************************************************************** * *be careful * * ***********************************************************/ int pop(CObject &_arg,BOOL swap = TRUE) { if(this->_read_list.empty()) { if(swap == FALSE) { return -1; } Auto_Mutex _auto_mutex(this->_mutex); if(!this->_write_list.empty()) { this->_write_list.swap(this->_read_list); } else { return -1; } } _arg = this->_read_list.front(); this->_read_list.pop_front(); return 0; } void push(CObject &_arg) { Auto_Mutex _auto_mutex(this->_mutex); this->_write_list.push_back(_arg); } int Size() { return this->_list.size(); } private: void swap() { if(!this->_read_list.empty()) { return; } Auto_Mutex _auto_mutex(this->_mutex); this->_write_list.swap(this->_read_list); } private: std::list<CObject> _write_list; std::list<CObject> _read_list; Mutex _mutex; }; #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> using namespace __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 ; return 0; } int bind(Key key,CObject _args) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map[key] = _args; return 0; } int unbind(Key key) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map.erase(key); return 0; } int Size() { Auto_R_Mutex _auto_mutex(this->_mutex); return this->_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; return 0; } int bind(Key _key,CObject _object) { Auto_W_Mutex _aotu_mutex(this->_mutex); this->_map[_key] = _object; return 0; } int unbind(Key _key) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map.erase(_key); return 0; } int Size() { Auto_R_Mutex _auto_mutex(this->_mutex); return this->_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(); int lock(); 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); return 0; } int RW_Mutex::rRelease() { pthread_rwlock_unlock(&_map_lock); return 0; } int RW_Mutex::wLock() { pthread_rwlock_wrlock(&_map_lock); return 0; } int RW_Mutex::wRelease() { pthread_rwlock_unlock(&_map_lock); return 0; } Mutex::Mutex() { pthread_mutex_init(&this->_lock,NULL); } Mutex::~Mutex() { pthread_mutex_destroy(&this->_lock); } int Mutex::lock() { pthread_mutex_lock(&this->_lock); return 0; } int Mutex::Release() { pthread_mutex_unlock(&this->_lock); return 0; }
相关文章推荐
- STL学习笔记之容器线程安全
- [JCIP笔记] (三)如何设计一个线程安全的对象
- 经验分享:浅谈服务器安全防护的几个策略
- Apache服务器运维笔记(6)----目录 文件 网络容器的安全问题
- Android开发设计模式之——单例模式关于线程不安全问题处理
- 20145238《信息安全系统设计基础》第1周学习笔记
- 天下数据分享服务器FTP安全攻略
- 提高信息系统用户帐户安全的几个增强功能分享
- Apache服务器运维笔记(2)----使用<IfDefine>容器实现不同的配置
- 服务器设计、线程、代理线程的学习
- (转)剖析nginx等单线程服务器设计原理与性能优势
- 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验
- 设计线程安全的Servlet
- Java学习笔记42:线程的几个方法和概念
- 信息安全系统设计基础实验五:简单嵌入式 WEB 服务器实验 (20135229,20135234)
- 服务器设计笔记(5)-----守护进程
- 分享国外几个主流的设计网站/社区
- Android安全学习笔记1-系统设计与架构
- 设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题
- Java的容器的线程安全