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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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;
}

相关文章
|
1月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
13天前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
2月前
|
JSON 自然语言处理 网络协议
【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器
猜数字游戏也算是入门一门编程语言必写的程序了。通过这个程序,我们可以熟悉Go语言中的输入输出、流程控制与随机函数的调用。
42 2
|
2月前
|
弹性计算 Kubernetes 监控
【阿里云弹性计算】阿里云 ECS 与 Kubernetes 集成:轻松管理容器化应用
【5月更文挑战第28天】阿里云ECS与Kubernetes集成,打造强大容器管理平台,简化应用部署,实现弹性扩展和高效资源管理。通过Kubernetes声明式配置在ECS上快速部署,适用于微服务和大规模Web应用。结合监控服务确保安全与性能,未来将深化集成,满足更多业务需求,引领容器化应用管理新趋势。
221 2
|
2月前
|
运维 Cloud Native 开发者
云原生架构的未来演进:从容器化到无服务器
【5月更文挑战第28天】 在现代IT领域,云原生技术正成为推动企业数字化转型的核心力量。本文将探讨云原生架构的关键组成部分,包括容器化、微服务以及无服务器计算,并预测这些技术的发展趋势。文章旨在提供一个全面的视角,以理解云原生生态系统如何适应日益复杂的业务需求,并支持构建更加灵活、可扩展的应用程序。
|
2月前
|
存储 C++ 容器
黑马c++ STL部分 笔记(7) list容器
黑马c++ STL部分 笔记(7) list容器
|
2月前
|
C++ 容器
黑马c++ STL部分 笔记(5) stack容器
黑马c++ STL部分 笔记(5) stack容器
|
1月前
|
监控 NoSQL Redis
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?
|
1月前
|
安全 Java 大数据
Java性能优化(七)-多线程调优-并发容器的使用
Java性能优化(七)-多线程调优-并发容器的使用
33 0
|
2月前
|
C++ 索引 容器
黑马c++ STL部分 笔记(9) map/multimap容器
黑马c++ STL部分 笔记(9) map/multimap容器