服务器设计笔记(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;
}

相关文章
|
3月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
349 1
|
7月前
|
Ubuntu 安全 数据安全/隐私保护
在Docker容器中部署GitLab服务器的步骤(面向Ubuntu 16.04)
现在,你已经成功地在Docker上部署了GitLab。这就是我们在星际中的壮举,轻松如同土豆一样简单!星际旅行结束,靠岸,打开舱门,迎接全新的代码时代。Prepare to code, astronaut!
500 12
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
196 2
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
305 1
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
【10月更文挑战第14天】多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。
101 1
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
3644 0
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
454 1
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
711 1
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。 #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;stdlib.h&gt; //sleep using namespace std; void t1() //普通的函数,用来执行线程 { for (int i = 0; i &lt; 10; ++i)
多线程;顺序容器;智能指针