C++消息分发器-简单实现

#include "Dispatcher.h"

int MessageQueue::PushMessage(Message* message)
{
	if (nullptr == message)
	{
		return -1;
	}
	lock_guard<mutex> lock(m_queueMutex);
	Message* copyMessage = new Message();
	copyMessage->cmdId = message->cmdId;
	copyMessage->jsonParam = message->jsonParam;
	m_messageQueue.push(copyMessage);
	return 0;
}

Message* MessageQueue::PopMessage()
{
	if (m_messageQueue.empty())
	{
		return nullptr;
	}
	lock_guard<mutex> lock(m_queueMutex);
	Message* message = m_messageQueue.front();
	m_messageQueue.pop();
	return message;
	// TODO: 在此处插入 return 语句
}

Dispatcher* Dispatcher::m_dispatcher = nullptr;
mutex Dispatcher::m_dispatcherMutex;
Dispatcher * Dispatcher::CreateDispatcher()
{
	if (nullptr == m_dispatcher)
	{
		lock_guard<mutex> lock(m_dispatcherMutex);
		if (nullptr == m_dispatcher)
		{
			m_dispatcher = new Dispatcher();
		}
	}
	return m_dispatcher;
}

int Dispatcher::RegisterHandler(int cmdId, pMessageHandler pHandler)
{
	m_messageHandlerMap.insert(pair<int, pMessageHandler>(cmdId, pHandler));
	return 0;
}

int Dispatcher::SendMessage(Message * message)
{
	if (nullptr == m_messageQueue)
	{
		return -1;
	}
	m_messageQueue->PushMessage(message);
	return 0;
}

int Dispatcher::DispatchLoop()
{
	while (m_bRunDispatch)
	{
		cout << "Dispatcher Thread is Runing.." << endl;
		this_thread::sleep_for(chrono::seconds(3));
		Message* message = m_messageQueue->PopMessage();
		if (nullptr == message)
		{
			continue;
		}
		auto handler = m_messageHandlerMap.find(message->cmdId);
		if (handler != m_messageHandlerMap.end())
		{
			handler->second(message->cmdId, message->jsonParam);
		}
		
	}
	return 0;
}

Dispatcher::Dispatcher()
{
	m_bRunDispatch = true;
	if (nullptr == m_messageQueue)
	{
		m_messageQueue = new MessageQueue();
	}
	if (nullptr == m_pThread)
	{
		m_pThread = new thread(&Dispatcher::DispatchLoop, this);
	}
}

Dispatcher::~Dispatcher()
{
}

#pragma once
#include <mutex>
#include <iostream>
#include <thread>
#include <chrono>
#include <queue>
#include <string>
#include <map>
using namespace std;

typedef int(*pMessageHandler)(int, string);

typedef struct _tagMessage
{
	int cmdId;
	string jsonParam;
}Message;

class MessageQueue
{
public:
	int PushMessage(Message* Message);
	Message* PopMessage();
private:
	mutex m_queueMutex;
	queue< Message*> m_messageQueue;
};


class Dispatcher
{
public:
	static Dispatcher* CreateDispatcher();
	int RegisterHandler(int cmdId, pMessageHandler pHandler);
	int SendMessage(Message* message);
private:
	Dispatcher();
	~Dispatcher();
	int DispatchLoop();
private:
	static Dispatcher* m_dispatcher;
	map<int, pMessageHandler> m_messageHandlerMap;
	static mutex m_dispatcherMutex;
	thread* m_pThread;
	bool m_bRunDispatch;
	MessageQueue* m_messageQueue;
};
// MessageDispatcher.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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

int TestFunction(int cmdId, string jsonParam)
{
	cout << "TestFunction Has been Deal A Message. cmdId:" << cmdId << ", param:" << jsonParam << endl;
}

int TestFunction1(int cmdId, string jsonParam)
{
	cout << "TestFunction1 Has been Deal A Message. cmdId:" << cmdId << ", param:" << jsonParam << endl;
}
int main()
{
	Message* message = new Message();
	message->cmdId = 100;
	message->jsonParam = "HelloMessage";
	Dispatcher* dispatcher = Dispatcher::CreateDispatcher();
	dispatcher->RegisterHandler(100, TestFunction);
	dispatcher->RegisterHandler(101, TestFunction1);
	while (true)
	{
		dispatcher->SendMessage(message);
		message->cmdId = message->cmdId == 100 ? 101 : 100;
        std::cout << "Hello World!\n";
		this_thread::sleep_for(chrono::seconds(5));
	}
	delete message;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种重用线程的机制,通过管理线程的生命周期、线程的数量和任务的调度,实现高效的多线程处理。线程池的主要目的是减少线程创建和销毁的开销,提高线程的重用性和整体性能。 线程池的实现可以采用依赖于具体语言和平台的不同方式。在C语言中,我们可以通过以下步骤来实现一个简单的线程池: 1. 定义线程池的数据结构。可以使用结构体来存储线程池的属性,如线程数量、互斥锁、条件变量等。 2. 初始化线程池。在初始化过程中,需要初始化线程池的属性,包括线程数量、互斥锁和条件变量,并创建指定数量的线程。 3. 定义工作任务。工作任务是线程池中的每个线程需要执行的具体任务。可以定义函数指针或结构体来表示工作任务。 4. 实现线程池的调度逻辑。在调度逻辑中,需要设置线程池中每个线程的状态,以及获取任务并分发给空闲线程进行处理。 5. 实现线程池的销毁操作。在销毁操作中,需要释放线程池中的资源,包括线程、互斥锁和条件变量。 通过以上步骤,我们可以实现一个简单的线程池。在实际应用中,还可以对线程池进行扩展,如设置最大线程数量、超时处理、任务队列等,以更好地满足实际需求。 线程池的优点是可以提高多线程程序的性能和效率,避免了线程创建和销毁的开销,提高了线程的重用性。同时,线程池还可以进行任务调度和管理,使得多线程的编程更加方便和可控。它可以适用于需要处理大量耗时任务的应用场景,如服务程序和并行计算等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值