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

devtools/2024/12/29 7:42:33/

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 queuetemplate<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 queuevoid pop_front(){std::lock_guard<std::mutex> lock(_lock);_queue.pop_front();}///! Checks if we're empty or not with locks heldbool 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.ppmy.cn/devtools/145012.html

相关文章

AR眼镜制备的步骤与关键技术

AR&#xff08;增强现实&#xff09;眼镜的制备涉及多个步骤和关键技术&#xff0c;涵盖硬件设计、软件开发以及系统集成。以下是详细的步骤和关键技术&#xff1a; 1. 硬件设计与制造 1.1 光学显示系统 关键技术&#xff1a; 波导技术&#xff1a;如光栅波导、全息波导、衍射…

帝国cms同一条信息使用不同的多个内容页模板伪静态实现教程

理论上可以实现一条信息使用无数个内容页模板&#xff0c;实现过程&#xff1a; 1、/e/action目录下新建bishun.php&#xff0c;内容如下&#xff1a; <?php require(../class/connect.php); require(../class/db_sql.php); require(../class/functions.php); require(..…

聊一聊性能测试是如何开展的?

目录 以下是开展性能测试的一般步骤&#xff1a; 明确目标&#xff1a; 环境设置&#xff1a; 选择或开发测试工具&#xff1a; 设计测试场景&#xff1a; 创建测试数据&#xff1a; 执行测试&#xff1a; 分析结果&#xff1a; 优化和调整&#xff1a; 重复测试&…

OCR多模态大模型:视觉模型与LLM的结合之路

原文&#xff1a;https://zhuanlan.zhihu.com/p/7783443583 在使用多模态大模型(Visual Language Model, VLM)做视觉信息抽取时&#xff0c;常常出现错字的问题。为了解决这一问题&#xff0c;本文提出了一种名为Guidance OCR的方法。该方法在不额外训练模型的情况下&#xff…

ubuntu image 中文支持

me locale 显示的是 locale.conf 的内容吗&#xff1f;下面&#xff0c;这些环境变量分别控制什么&#xff1f;我想系统支持渲染中文字符&#xff0c;但是系统默认语言设置为英文&#xff0c;设置哪些环境变量 LANGC LC_CTYPE“C” LC_NUMERIC“C” LC_TIME“C” LC_COLLATE“C…

【CVE-2024-56145】PHP 漏洞导致 Craft CMS 出现 RCE

大多数开发人员都同意,与 15 年前相比,PHP 是一种更加理智、更加安全和可靠的语言。PHP5早期的不良设计已让位于更好的开发生态系统,其中包括类、自动加载、更严格的类型、更理智的语法以及一大堆其他改进。安全性也没有被忽视。 register_globals一些老读者可能还记得和的…

2.5.1 文件管理基本概念

文章目录 文件文件系统文件分类 文件 文件&#xff1a;具有符号名&#xff0c;逻辑上有完整意义的一组相关信息的集合。 文件包含文件体、文件说明两部分。文件体存储文件的真实内容&#xff0c;文件说明存放操作系统管理文件所用的信息。 文件说明包含文件名、内部标识、类型、…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…