简介本文向大家介绍一个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>;
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文实现C++中UTF-8与GB2312相互转换,感兴趣的朋友可以参考一下。