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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

    首先是 队列 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;
}

相关文章
|
8天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
18天前
|
Kubernetes 容器
k8s容器时间与服务器时间不一致问题
k8s容器时间与服务器时间不一致问题
17 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
39 0
|
2天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
10 1
|
25天前
|
监控 数据可视化 虚拟化
Docker容器常用命令笔记分享
Docker容器常用命令笔记分享
50 2
|
1月前
|
存储 网络协议 数据可视化
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
|
2月前
|
Linux 应用服务中间件 nginx
国服浪潮服务器操作系统——KeyarchOS多容器架设体验心得
国服浪潮服务器操作系统——KeyarchOS多容器架设体验心得
55 0
|
3月前
|
弹性计算 安全 Linux
幻兽帕鲁云服务器搭建笔记,详细记录
如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程
43 0
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
3月前
|
虚拟化 Docker Windows
docker容器和服务器镜像
【1月更文挑战第15天】docker容器和服务器镜像
511 0