C++实现一个多线程安全的队列容器模板类

2022-11-21 16:57:31 2286人已围观 10已点赞 14人已收藏

简介本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。

头文件形式实现

Queue.h文件:

// 用于缓存数据包的队列容器
#pragma once

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <process.h>
#include <list>

template<class T>
class CSafeQueue
{
public:
	CSafeQueue()
	{
		// 创建互斥量
		m_hMutex = CreateMutex(
			NULL, // 使用默认的安全属性
			FALSE,// 默认未获得拥有权
			NULL);// 匿名
	}
	virtual ~CSafeQueue()
	{
		CloseHandle(m_hMutex);
	}

public:
	// 是否为空
	bool IsEmpty()
	{
		Lock();
		bool bTemp = m_list.empty();
		Unlock();

		return bTemp;
	}
	// 获取当前队列大小
	int Length()
	{
		Lock();
		int nTemp = m_list.size();
		Unlock();

		return nTemp;
	}
	// 出列
	T Pop()
	{
		Lock();

		T Temp;
		if (!m_list.empty())
		{
			Temp = m_list.front();
			m_list.pop_front();
		}

		Unlock();

		return Temp;
	}
	// 入列
	bool Push(const T& inElement)
	{
		Lock();
		m_list.push_back(inElement);
		Unlock();

		return true;
	}
private:
	int Lock()
	{
		// 等待其它线程释放互斥量
		WaitForSingleObject(m_hMutex, INFINITE);  // no time-out interval
		return 0;
	}
	int Unlock()
	{
		ReleaseMutex(m_hMutex);
		return 0;
	}
	HANDLE m_hMutex;
	std::list<T> m_list;// 元素
};

头文件+源文件形式实现

Queue.h文件:

// 用于缓存数据包的队列容器
#pragma once

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <list>

template<class T>
class CSafeQueue
{
public:
	CSafeQueue();
	virtual ~CSafeQueue();
public:
	// 是否为空
	bool IsEmpty();
	// 获取当前队列大小
	int Length();
	// 出列
	T Pop();
	// 入列
	bool Push(const T& inElement);
private:
	int Lock();
	int Unlock();
	HANDLE m_hMutex;
	std::list<T> m_list;// 元素
};

Queue.cpp文件:

#include "stdafx.h"
#include "Queue.h"
#include <process.h>

template<class T> CSafeQueue<T>::CSafeQueue()
{
	// 创建互斥量
	m_hMutex = CreateMutex(
		NULL, // 使用默认的安全属性
		FALSE,// 默认未获得拥有权
		NULL);// 匿名
}
template<class T> CSafeQueue<T>::~CSafeQueue()
{
	CloseHandle(m_hMutex);
}

// 是否为空
template<class T> bool CSafeQueue<T>::IsEmpty()
{
	Lock();
	bool bTemp = m_list.empty();
	Unlock();

	return bTemp;
}

// 获取当前队列大小
template<class T> int CSafeQueue<T>::Length()
{
	Lock();
	int nTemp = m_list.size();
	Unlock();

	return nTemp;
}

// 出列
template<class T> T CSafeQueue<T>::Pop()
{
	Lock();

	T Temp;
	if (!m_list.empty())
	{
		Temp = m_list.front();
		m_list.pop_front();
	}

	Unlock();

	return Temp;
}

// 入列
template<class T> bool CSafeQueue<T>::Push(const T& inElement)
{
	Lock();
	m_list.push_back(inElement);
	Unlock();

	return true;
}

// 获得互斥量
template<class T> int CSafeQueue<T>::Lock()
{
	// 等待其它线程释放互斥量
	WaitForSingleObject(m_hMutex, INFINITE);  // no time-out interval
	return 0;
}

// 释放互斥量
template<class T> int CSafeQueue<T>::Unlock()
{
	ReleaseMutex(m_hMutex);
	return 0;
}

/************************************ 显式实例化 *****************************/
template class CSafeQueue <std::string>;


源码下载
  • 最近更新:   2022-06-14开发环境:   Visual Studio 2015
  • 源码大小:   1.08KB下载次数:  7 

更多为你推荐