【C++服务端技术】消息队列

ThreadWorkUnit.h

#pragma once
#include
#include
#include "SafeQueue.h"

namespace Extralib
{
    namespace Thread
    {
        //消息結構體
        struct sWorkItem
        {
            sWorkItem()
            {
                type = 0;
                nDataSize = 0;
                pData = NULL;
                param1 = 0;
            }

            void Set(char type,int param1,int size,char* data)
            {
                this->type = type;
                this->param1 = param1;
                nDataSize = size;
                pData = data;
            }

            short type;             //类型取决于不同系统的设定,并不固定
            int param1;             //消息id
            unsigned int nDataSize; //消息包大小
            char* pData;            //消息包
        };

        class ThreadWorkUnit
        {
        public:
            ThreadWorkUnit();
            virtual ~ThreadWorkUnit();

            //线程循环处理函数
            virtual int svc();

            void PushItem(const sWorkItem& data);

            bool PopItem(sWorkItem& data);
            bool GetItem(sWorkItem& data);

            void PopAllItems(std::list& result_queue);

            bool isStop(){ return m_bStop;}

            /*
            * 启动工作线程
            */
            int Start();

            /*
            * 结束工作线程(可重复启动)
            */
            void Stop();
        private:
            SafeQueue::safe_queue m_msg;
            pthread_t tid;
            bool m_bStop;
        };
    }
}

ThreadWorkUnit.cpp

#include "ThreadWorkUnit.h"
#include "AutoLock.h"
#include "../OS/OS.h" //只是一个sleep头文件

namespace Extralib
{
    namespace Thread
    {

        template
        void* _thread_t(void* param)
        {
            TYPE* This = (TYPE*)param;
            This->svc();
            return NULL;
        }

        ThreadWorkUnit::ThreadWorkUnit()
        {
            m_bStop = true;
        }

        ThreadWorkUnit::~ThreadWorkUnit()
        {

        }

        int ThreadWorkUnit::svc()
        {
            return 0;
        }

        void ThreadWorkUnit::PushItem(const sWorkItem& data)
        {
            m_msg.push(data);
        }

        bool ThreadWorkUnit::PopItem(sWorkItem& data)
        {
            return m_msg.try_pop(data);
        }

        void ThreadWorkUnit::PopAllItems(std::list& result_queue)
        {
            m_msg.exchange(result_queue);
        }

        int ThreadWorkUnit::Start()
        {
            m_bStop = false;

            pthread_create(&tid, NULL, _thread_t, this);
            return 1;
        }

        void ThreadWorkUnit::Stop()
        {
            m_bStop = true;
        }

        bool ThreadWorkUnit::GetItem( sWorkItem& data )
        {
            if(!m_msg.empty())
            {
                data = m_msg.front();
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

Original: https://www.cnblogs.com/byfei/p/14104063.html
Author: byfei
Title: 【C++服务端技术】消息队列

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535132/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【面试攻略】C++面试-紫龙游戏

    2020-11-25-紫龙 1.const有哪些用法https://blog.csdn.net/htyurencaotang/article/details/9276743?utm…

    C++ 2023年5月29日
    058
  • c++ 条件变量

    http://blog.csdn.net/hemmanhui/article/details/4417433 互斥锁:用来上锁。 条件变量:用来等待,当条件变量用来自动阻塞一个线程…

    C++ 2023年5月29日
    042
  • C++中的POD类型

    参考 定义 总结与理解 参考 https://en.cppreference.com/w/cpp/named_req/PODType 定义 知识的搬运工,以下内容抄的,虽然是硬性定…

    C++ 2023年5月29日
    064
  • C++面试题1

    1,LeetCode给出一个 32 位的有符号整数,将这个整数中每位上的数字进行反转; 2,怎么判断一个变量是指针; Original: https://www.cnblogs.c…

    C++ 2023年5月29日
    053
  • [图形图像]C++实现的软件光栅器

    第1张: 从坐到右,从上到下。无纹理、无镜面光、无深度缓冲,依次是: 线框。 纯色。 即每个三角形一个颜色。 flat着色(相比上次,修正后的效果好多了)。也是每个三角形一个颜色,…

    C++ 2023年5月29日
    065
  • C++入门笔记

    一直对C++感到很恐惧,大学里有C的基础,今天终于鼓足勇气入门C++,先大致了解一下,以后用到的时候再详细深入。 Android中有一些很火的领域比如:音视频、物联网,都会涉及到J…

    C++ 2023年5月29日
    061
  • The main difference between Java & C++(转载)

    C++ supports pointers whereas Java does not pointers. But when many programmers questioned…

    C++ 2023年5月29日
    063
  • C++ 使用静态链接库和动态链接库

    C++ 使用AdbHelper静态链接库 ## 必备文件:静态库AdbHelper.h,AdbHelper.lib以及动态库AdbHelper.dll ##   资源文件使用用法:…

    C++ 2023年5月29日
    051
  • C++ 借助指针突破访问权限的限制,访问private、protected属性的成员变量(花拳绣腿)

    #include <iostream> using namespace std; class A { public: A(int a, int b, int c); p…

    C++ 2023年5月29日
    056
  • C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于…

    C++ 2023年5月29日
    049
  • C++的sort函数

    参考: https://baike.baidu.com/item/sort%E5%87%BD%E6%95%B0/11042699?fr=aladdin https://blog.c…

    C++ 2023年5月29日
    063
  • Google C++ 单元测试 GTest

    from : http://www.cnblogs.com/jycboy/p/6057677.html 一、设置一个新的测试项目 在用google test写测试项目之前,需要先编…

    C++ 2023年5月29日
    035
  • 【面试攻略】C++面试-点点互动

    2020-11-23-点点互动 自我介绍 1.redis的数据结构和优化 https://blog.csdn.net/weixin_43631706/article/details…

    C++ 2023年5月29日
    054
  • C++ 相关库

    C++ 相关库 说明 RapidJSONhttps://github.com/Tencent/rapidjson Original: https://www.cnblogs.com…

    C++ 2023年5月29日
    062
  • 聊聊 C++ 右值引用 和 移动构造函数

    一: 背景 最近在看 C++ 的右值引用和移动构造函数,感觉这东西一时半会还挺难理解的,可能是没踩过这方面的坑,所以没有那么大的深有体会,不管怎么说,这一篇我试着聊一下。 二: 右…

    C++ 2023年5月29日
    051
  • 面向对象C++编程与实践考试答案与解析

    一、选择题(每题2分,共2×20=40分) (1) 以下不能对数组 a 进行正确初始化的语句是( C )。A. int a[2][3] = { 0 };B. int a[ ][3]…

    C++ 2023年5月29日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球