ThreadWorkUnit.h

#pragma once
#include <queue>
#include <pthread.h>
#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<sWorkItem>& result_queue);

			bool isStop(){ return m_bStop;}	

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

			/*
			* 结束工作线程(可重复启动)
			*/
			void Stop();
		private:
			SafeQueue::safe_queue<sWorkItem> 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 <typename TYPE, int (TYPE::*svc)() >
		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<sWorkItem>& result_queue)
		{
			m_msg.exchange(result_queue);
		}

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

			pthread_create(&tid, NULL, _thread_t<ThreadWorkUnit, &ThreadWorkUnit::svc>, 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;
			}
		}
	}
}

 

posted @ 2020-12-08 10:45 byfei 阅读(389) 评论(0) 推荐(0) 编辑
摘要: #pragma once#include namespace Extralib{ namespace Thread { /* * 利用对象生存周期自动加解锁,比较安全 */ class AutoLock { public: pthread_mu... 阅读全文
posted @ 2020-12-08 10:26 byfei 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 链表和锁实现的队列,锁的代码请看其他文章 #pragma once#include #include "AutoLock.h"namespace Extralib{ namespace SafeQueue { using namespace Thread; ... 阅读全文
posted @ 2020-12-08 10:20 byfei 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 代码没贴全,就少一个锁头文件,可以做设计参考 设计思想就是维护一个空闲链表,没有用的就重新申请,有的话就拿链表的头,使用完又还给空闲链表。 /*一个分配固定大小内存的内存池,使用链表维护*/#pragma once#include using namespac... 阅读全文
posted @ 2020-12-08 10:03 byfei 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 2020-11-26-边锋 1.说说你以前的架构 2.C++11特性,好像问到了这个constexpr https://www.jianshu.com/p/5480c4a35d1d 3.C++右值引用与左值引用 https://blog.csdn.net/kk... 阅读全文
posted @ 2020-11-26 16:02 byfei 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 2020-11-26-成都星合互娱 hr 1.离职原因 2.工作总结 3.学历 4.期望薪资 技术面 1.自我介绍 2.项目架构 3.内存管理 4.智能指针 5.对象封装 6.lua热更,热更对象的成员数据怎么处理 7.go语言的了解 8.你知道一般前段比后端... 阅读全文
posted @ 2020-11-26 14:17 byfei 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 2020-11-25-紫龙 1.const有哪些用法 https://blog.csdn.net/htyurencaotang/article/details/9276743?utm_medium=distribute.pc_relevant_t0.no... 阅读全文
posted @ 2020-11-25 15:58 byfei 阅读(573) 评论(0) 推荐(0) 编辑
摘要: HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言... 阅读全文
posted @ 2020-11-25 12:36 byfei 阅读(585) 评论(0) 推荐(0) 编辑
摘要: 2020-11-24-沐瞳游戏 自我介绍 1.你们IO用的什么(HPsocket),他是怎么实现的,(HPsocket他Windows通信用的什么) 2.tcp的三次握手四次挥手 3.有一个timewait状态,你知道吗,怎么忽略timewait这个状态 ht... 阅读全文
posted @ 2020-11-24 12:43 byfei 阅读(592) 评论(0) 推荐(0) 编辑
摘要: 2020-11-23-点点互动 自我介绍 1.redis的数据结构和优化 https://blog.csdn.net/weixin_43631706/article/details/106167674 https://www.cnblogs.com/xiexj... 阅读全文
posted @ 2020-11-24 10:43 byfei 阅读(222) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示