首页 > 其他分享 >一个用于多线程共享数据保护测试的简易游戏服务器代码

一个用于多线程共享数据保护测试的简易游戏服务器代码

时间:2023-11-25 14:11:06浏览次数:41  
标签:msgRecvQueue std include int void 数据保护 服务器 多线程

#include <iostream>
#include <thread>
#include <list>
#include <mutex>

//一个线程负责从客户端读取用户的命令,放入一个队列中;
//另一个线程负责从队列中读取命令并解析,假设用一个int变量代表一个命令。
class A
{
public:    
    //这里无法模拟从网络接受命令的过程,我们简单地用一个循环模拟。
    void inMsgRecvQueue();

    //这个函数把代码中涉及到共享数据访问的操作封装起来,方便加锁操作
    bool outMsgLULProc(int& command);
    void outMsgRecvQueue();


public:
    std::list<int> msgRecvQueue;
    std::mutex mutex_msgRecvQueue;
};

void A::inMsgRecvQueue()
{
    for (int i = 0; i < 10000; ++i)
    {
        msgRecvQueue.push_back(i);
        std::cout << "inMsgRecvQueue执行,插入一个元素" << i << " " << std::endl;
    }
    std::cout << "end of inRecvQueue " << std::endl;
}

bool A::outMsgLULProc(int& command)
{
    if (!msgRecvQueue.empty())
    {
        command = msgRecvQueue.front();
        msgRecvQueue.pop_front();
        return true;
    }
    return false;
}

void A::outMsgRecvQueue()
{
    int command = 0;
    for( int i=0; i<10000; i++ )
    {
        bool result = outMsgLULProc(command);
        if (result == true)
        {
            std::cout << "outMsgRecvQueue执行,读出一个元素" << command << " " << std::endl;
            //处理数据
        }
        else
        {
           //std::cout << "outMsgRecvQueue执行,但队列为空。" << std::endl;
        }
    }
    std::cout << "end of outMsgRecvQueue " << std::endl;
}

int main()
{
    std::cout << "begin of main " << std::endl;
    
    A myobja;
    //注意这里直接使用A::访问A的成员函数,并通过取地址得到函数指针; 这里使用&myobja有点歧义,它
    //不是取myobja的地址的意思,它的意思是使用myobja的引用。
    //这里使用引用才能保证两个线程里用的是用一个myobja对象。
    std::thread myInMsgObj(&A::inMsgRecvQueue, &myobja);
    std::thread myOutnMsgObj(&A::outMsgRecvQueue, &myobja);

    myInMsgObj.join();
    myOutnMsgObj.join();

    std::cout << "end of main" << std::endl;
    return 0;
}

 

标签:msgRecvQueue,std,include,int,void,数据保护,服务器,多线程
From: https://www.cnblogs.com/pkuqcy/p/17855475.html

相关文章

  • 搭建DHCP服务器笔记全套
    Top目录OS下DHCP配置安装DHCPIPV4配置IPV6配置ipv6其他配置开启dhcp服务其他华三交换机DHCP配置DHCP常用命令完整配置DHCP服务其他可选配置常用Option配置说明OS下DHCP配置安装DHCP#centos6.8yuminstalldhcp#rhel8.3yuminstalldhcp-server#若......
  • 多线程
    多线程线程其实是程序中的一条执行路径我之前所以写的程序,其实都是单线程程序那么怎样的程序才是多线程程序呢?支持同时有很多人一起进入网站,并且每一个人的行为互不影响。例如百度网盘中,可以同时上传或者下载的多个文件,这些程序中其实就有多条执行路径,每一个执行路径就是一条......
  • C++11 多线程并发 互斥量、条件变量和信号量
    互斥量Classesmutex(C++11)providesbasicmutualexclusionfacility(class)timed_mutex(C++11)providesmutualexclusionfacilitywhichimplementslockingwithatimeout(class)recursive_mutex(C++11)providesmutualexclusionfacili......
  • 【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套md格式笔记和代码自取:请移步这里......
  • 谨防利用Redis未授权访问漏洞入侵服务器
    说明:Redis是一个开源的,由C语言编写的高性能NoSQL数据库,因其高性能、可扩展、兼容性强,被各大小互联网公司或个人作为内存型存储组件使用。但是其中有小部分公司或个人开发者,为了方便调试或忽略了安全风险,没有设置密码并直接对外开放了6379端口,那么这就是一个危险的行为。漏洞成......
  • java多线程学习之路-不能理解
    1importjava.util.concurrent.CountDownLatch;23/**4*颠覆理解的,为什么不会出问题,执行多次,结果都是正确,并且一致5*/6classMyData{7inta=5;//可预定总座位数8intb=0;//已预定座位数910publicvoidyd(){11if(b<......
  • Linux服务器时间校准
    1.离线情况下安装ntprpm-qa|grepntp2.在线情况下安装ntpyum-yinstallntp3.校正服务器时间与网络时间同步ntpdatecn.pool.ntp.org4.设置时区Pleaseidentifyalocationsothattimezonerulescanbesetcorrectly.Pleaseselectacontinentorocean.1......
  • 服务器 功能更新
    1.更新代码gitee代码2.登录阿里云ecs云服务器后端:3.进入项目目录(home/pig)后端开发分支(dev1)4.更新最新代码(gitpull)5.进去更改代码目录(cd层级名称)6.执行编译命令(mvncleaninstall)7.返回到项目根目录home/pig8.执行docker命令docker-com......
  • C++11 多线程(std::thread)实例
    C++11的std::thread在C中已经有一个叫做pthread的东西来进行多线程编程,但是并不好用(如果你认为句柄、回调式编程很实用,那请当我没说),所以c++11标准库中出现了一个叫作std::thread的东西。std::thread常用成员函数构造&析构函数举个栗子例一:thread的基本使用1//Compiler:......
  • 使用CloudStats监控Linux服务器
    CloudStats是一个服务器监控平台,可让您轻松地监控整个服务器基础平台,同时也可以立即采取行动并解决问题。CloudStats监控工具不需要任何特殊技能或知识来执行设置并开始监控您的服务器。因为是国外的服务器,打开有点慢!在服务器( /Debian/Ubuntu/Fedora等)上安装CloudStats......