服务器设计笔记(5)-----分享几个线程安全的容器

    首先是 队列 PipeList   

/*
 * 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;
}
时间: 2024-08-28 09:13:28

服务器设计笔记(5)-----分享几个线程安全的容器的相关文章

服务器设计笔记(1)-----定时器的实现(C++)

很久之前听著名页游服务器主程讲座时,讲到过定时器的实现,基本思路如下(易语言)        while(true)        {              对定时器进行排序.              for(遍历定时器)              {                    if 如果定时器到:                           callback;                    else                            bre

服务器设计笔记(4)-----客户端通信模块

   整个底层通信模块修改过很多次,因为首次使用epoll,在其中遇见了很多问题,最终设计成下面的方式:        1: 对于epoll中EPOLLOUT事件的使用,因为频繁的调用send()函数,系统会在内核模式和用户模式之间切换太多消耗太大,所以最终启用了定时器模式,比如以50ms为间隔,定时的遍历所有的ClientPlayer 去发送 OutStream 里面的数据.    2: 最开始使用玩家的id 对应每个玩家的ClientPlayer的,在玩家没有进入的时候 使用玩家的账号名:

服务器设计笔记(2)-----定时器的实现(C++)

   很久之前听著名页游服务器主程讲座时,讲到过定时器的实现,基本思路如下(易语言)        while(true)        {              对定时器进行排序.              for(遍历定时器)              {                    if 如果定时器到:                           callback;                    else                           

服务器设计笔记(5)-----守护进程

守护进程的定义:        通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.这事百科对此的解释,在游戏服务器里面也有守护进程,特点大概也类似. 游戏守护进程的定义:        游戏服务器里面的守护进程大概完成的职责有这些.1,负责多个进程的启动:2,在进程挂掉的时候负责启动相应的进程:3,可以查询程序运行的情况等等. 游戏守护进程的原理:       设计守护进程为父进程,验证进程,聊天

服务器设计笔记(3)-----消息队列

    摘抄的一篇文章,故拿出来记录下,下篇博客把解决代码分享出来.感谢这篇文章的原作者,解决了棘手的问题.       我们所能想到的最简单的消息队列可能就是使用stl的list来实现了,即消息队列内部维护一个list和一个互斥锁,putMessage时将message加入到队列尾,getMessage时从队列头取一个message返回,同时在getMessage和putMessage之前都要求先获取锁资源. 实现虽然简单,但功能是绝对满足需求的,只是性能上可能稍稍有些不尽如人意.其最大的问题

服务器设计笔记(1)-----消息的封装

    消息的封装方式有多中,比如xml,json等,但是我依然觉得使用拼数据的方式最简单,也最节省带宽.比如我们处理一个逻辑就可以这样处理了:     int cast_net(MessageBlock &mb)     {         int  area_id,lvl;         mv >> area >> lvl;         //逻辑处理         //....         MessageBlock re_mb;         re_mb

动态网页设计笔记

动态网页设计笔记    JavaScript.ASP.ASP.Net.JSP笔记   JavaScript ASP.net ASP 1.基本控件的使用6.客户端脚本的基本对象    ***41.常用的Javascript内建类的方法  ***2.让TextArea自动换行3.让TextArea支持Table键4.复制数据到剪贴板5.得到当前选中的文本7.保护自己编写的HTML和脚本的方法8.IE地址栏前换成自己的图标9.可以在收藏夹中显示出你的图标10.关闭输入法11.直接查看源代码12.在Ja

界面设计中的整合设计实例经验分享

整合的目的在于提升效率,优化功能,增加愉快的体验,是个环保设计的好方向.作为界面设计师,好像也可以在这个角度做一些发想.遍布的操作按钮.众多的功能,让一个界面变得沉重不堪. 又到了写作文的时候,依然开始于脑袋一片空白无从下手.似乎我的脑袋从来都是走简约风格,那就得小题大做的无中生有.无中生有就需要想象了,想象就要把记忆和五感一一拆散,拾起几块拼起,粘牢.让人愉快的是,一些美妙的想法也就在这个时候在每个人的脑袋里长了出来. 设计师有时也尝试将几个原本毫无关系的事物莫名其妙的凑在一起,却巧妙甚至幽默

网站建设网页设计小技巧分享

网站建设网页设计小技巧分享.在网站建设的过程中我们会遇到很多问题,我们也会去解决各类问题.无论是网站设计还是代码编写.今天针对网站建设过程中我们会遇到的一些小问题,并给出一些简单的解决办法. Ie6不支持Png格式下的透明.效果图如下: 应用解析:有不少人都会对LOGO进行透明处理以融入head部分的渐变背景. 解决方案:采用JS代码实现或CSS滤镜功能,当然问题也存在部分,导致图片质成像量不高. 小技巧1:将透明的LOGO用高于IE6的浏览器打开网页,然后采用FF的PearlCrescentP