Linux高级--3.3.2.3 开源项目有锁队列实现--魔兽世界tinityCore

news/2024/12/28 0:03:28 标签: 开源

TrinityCore 项目简介

TrinityCore 是一个开源项目,旨在提供一个高性能的 MMO 游戏服务器(例如《魔兽世界》)的框架。该项目实现了游戏的服务器端逻辑,支持多种协议和客户端版本,能够模拟游戏世界、玩家行为、战斗系统等核心功能。

TrinityCore 的主要特点包括:

  1. 高性能:通过高效的数据库结构和多线程支持,TrinityCore 能够在大规模玩家环境下保持良好的性能。
  2. 可扩展性:支持插件和自定义脚本,允许开发者扩展功能或修改游戏行为。
  3. 跨平台:支持 Windows 和 Linux 系统。
  4. 开源:通过 GitHub 上的开源代码库,任何人都可以查看、修改和贡献代码。

TrinityCore 包含多个模块,如:

  • 世界服务器:处理游戏逻辑、玩家交互等。
  • 数据库服务:管理游戏数据,如角色信息、物品、任务等。
  • 登录服务器:处理玩家的登录请求并进行身份验证。
  • 脚本系统:允许开发者编写 Lua 或 C++ 脚本来扩展服务器功能。

 克隆 TrinityCore 仓库

        git clone https://github.com/TrinityCore/TrinityCore.git

 LockedQueue.h 有锁队列操作

LockedQueue.h 文件通常定义了一个线程安全的队列(锁定队列),通常用于在多线程环境下安全地进行数据传递和处理。此文件包含了与互斥量、条件变量等同步原语相关的实现,以保证在多个线程之间共享队列时,数据的一致性和安全性。

在 TrinityCore 中,LockedQueue 是一个常用的数据结构,它通常用于任务队列、网络消息队列等场景。该队列保证在多线程环境下对队列的操作是线程安全的,防止出现竞争条件。

LockedQueue.h 文件的位置: 在 TrinityCore 项目中,LockedQueue.h 文件一般位于以下路径:

TrinityCore/src/server/shared/LockedQueue.h

该文件实现了一个模板类 LockedQueue,允许存储任意类型的元素,并在多线程环境下提供基本的队列操作(如插入、删除、查询等)同时保证线程安全。

LockedQueue.h

#ifndef MARK_LOCKEDQUEUE_H
#define MARK_LOCKEDQUEUE_H

#include <deque>
#include <mutex>

template <class T, typename StorageType = std::deque<T> >
class LockedQueue
{
    //! Lock access to the queue.
    std::mutex _lock;

    //! Storage backing the queue.
    StorageType _queue;

    //! Cancellation flag.
    volatile bool _canceled;

public:

    //! Create a LockedQueue.
    LockedQueue()
        : _canceled(false)
    {
    }

    //! Destroy a LockedQueue.
    virtual ~LockedQueue()
    {
    }

    //! Adds an item to the queue.
    void add(const T& item)
    {
        lock();

        _queue.push_back(item);

        unlock();
    }

    //! Adds items back to front of the queue
    template<class Iterator>
    void readd(Iterator begin, Iterator end)
    {
        std::lock_guard<std::mutex> lock(_lock);
        _queue.insert(_queue.begin(), begin, end);
    }

    //! Gets the next result in the queue, if any.
    bool next(T& result)
    {
        std::lock_guard<std::mutex> lock(_lock);

        if (_queue.empty())
            return false;

        result = _queue.front();
        _queue.pop_front();

        return true;
    }

    template<class Checker>
    bool next(T& result, Checker& check)
    {
        std::lock_guard<std::mutex> lock(_lock);

        if (_queue.empty())
            return false;

        result = _queue.front();
        if (!check.Process(result))
            return false;

        _queue.pop_front();
        return true;
    }

    //! Peeks at the top of the queue. Check if the queue is empty before calling! Remember to unlock after use if autoUnlock == false.
    T& peek(bool autoUnlock = false)
    {
        lock();

        T& result = _queue.front();

        if (autoUnlock)
            unlock();

        return result;
    }

    //! Cancels the queue.
    void cancel()
    {
        std::lock_guard<std::mutex> lock(_lock);

        _canceled = true;
    }

    //! Checks if the queue is cancelled.
    bool cancelled()
    {
        std::lock_guard<std::mutex> lock(_lock);
        return _canceled;
    }

    //! Locks the queue for access.
    void lock()
    {
        this->_lock.lock();
    }

    //! Unlocks the queue.
    void unlock()
    {
        this->_lock.unlock();
    }

    ///! Calls pop_front of the queue
    void pop_front()
    {
        std::lock_guard<std::mutex> lock(_lock);
        _queue.pop_front();
    }

    ///! Checks if we're empty or not with locks held
    bool empty()
    {
        std::lock_guard<std::mutex> lock(_lock);
        return _queue.empty();
    }
};
#endif

test.cpp

#include "LockedQueue.h"
#include <iostream>

class MyData {
public:
    int id;
    std::string name;

    MyData() {}

    MyData(int i, const std::string &n) : id(i), name(n) {}

    void print() const {
        std::cout << "ID:" << id << ", name:" << name << std::endl;
    }  
};

int main() {
    LockedQueue <MyData>queue;
    queue.add(MyData(5, "Item 1"));
    queue.add(MyData(15, "Item 2"));
    queue.add(MyData(20, "Item 3"));

    MyData tmp;
    if (queue.next(tmp)) {
        tmp.print();
    }

    // 使用 readd 方法将多个元素重新放回队列前端
    std::deque<MyData> items = {MyData(30, "Item 4"), MyData(35, "Item 5")};
    queue.readd(items.begin(), items.end());

    if (queue.next(tmp)) {
        tmp.print();
    }   

    // 查看队列中的第一个元素,但不移除它
    MyData& peekItem = queue.peek();
    std::cout << "Peek: ";
    peekItem.print();

    // 检查队列是否为空
    std::cout << "Queue empty: " << std::boolalpha << queue.empty() << std::endl;

    // 获取并打印队列中剩余的所有元素
    while (queue.next(tmp))
    {
        tmp.print();
    }

    // 将队列标记为已取消
    queue.cancel();
    std::cout << "Queue canceled: " << std::boolalpha << queue.cancelled() << std::endl;
}

https://github.com/0voice


http://www.niftyadmin.cn/n/5802174.html

相关文章

华三M-LAG场景下,部分MAC内的流量泛洪导致端口流量打满

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 问题描述 华三M-LAG场景下&#xff0c;部分MAC内的流量泛洪导致端口流量打满 解决方案 在交换机设备上创建1个无用的聚合口&#xff0c;该聚合口加入到mlag组&#xff0c;并将异常泛洪的MAC加入到该接口即可解决。&…

在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”

1. 异常描述 在linux系统中使用jdbc访问sqlite数据库时出现如下错误提示&#xff1a; 2. 异常分析 可能是当前使用版本的sqlite-jdbc-xxx.jar版本有bug。 3. 异常解决 我是从3.8.9.1版本换到了3.16.1版本就好了。

Security知识点分享之高级安全安装虚拟机

高级安全安装虚拟机【知识分享】 在高级安全领域&#xff0c;安装虚拟机不仅需要考虑基本的配置&#xff0c;还需要遵循一系列安全最佳实践来确保虚拟环境的安全性。以下是一些关键的安全措施和技术干货分享&#xff1a; 1. 虚拟机防火墙配置 在VMWare WorkStation中&#xf…

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Android使用DataStore保存数据之后断电重启设备数据丢失临时解决办法

前言&#xff1a; 自 DataStore 被推荐用来取代 SharedPreferences 后&#xff0c;我便将其应用于项目之中。然而在实际使用过程中&#xff0c;却遭遇了严重的问题&#xff1a;一旦发生立即断电重启的情况&#xff0c;数据不仅无法保存&#xff0c;甚至还会出现损坏且无法恢复…

【经验总结】AUTOSAR架构下基于TJA1145收发器偶发通信丢失不可恢复问题分析

目录 前言 正文 1.问题描述 2.尝试问题复现 3.尝试问题定位 4.直接原因 5.总结 前言 在《【CAN通信】TJA1145收发器重要功能介绍》一文中我们详细介绍了TJA1145收发器的重点内容,最近在开发测试过程中就遇到了一个CAN通信丢失且不可恢复的偶发问题,解决该问题的思路和…

电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?

一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整&#xff1a;某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷&#xff0c;导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击&#xff1a;病毒、木马等恶意软件可能会篡改或删除系统文件&#x…

sentinel学习笔记8-系统自适应与黑白名单限流

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html 系统自适应 Sentinel 系统自适应保护从整体维度对应用入口流量进行…