并发高性能C++ 双向队列,数据越多速度越快

本文介绍了如何使用C++实现一个高性能的队列类PackageCache,模仿DX3D12游戏绘制队列的设计,包括添加数据、获取数据以及线程安全操作。代码示例展示了如何在主函数中使用该队列进行数据传输。
摘要由CSDN通过智能技术生成

C++ 11 实现高性能队列,参考DX 3D 12 游戏绘制队列部分设计方式。

测试代码可以从文章中下载:

直接干货:

using test_buffer = std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char>>;

也可直接使用std::string

以上 test_buffer 代码定义只是希望给新手提供更多的字符串操作方式用例。

int main()
{
	PackageCache<test_buffer>	m_cacheDatas;

	std::future<void>	testThread;

	testThread = std::async(std::launch::async, [&] 
	{
		for (int i = 0; i < 13000; i++)
		{
			char buff[8] = { 0 };
			sprintf_s(buff, "%d", i);
			m_cacheDatas.addData(test_buffer(buff));

			if (i > 12000)
				Sleep(1);
		}

		m_cacheDatas.addData(test_buffer("-1"));
	});

	Sleep(100);

	test_buffer temp;

	while (true)
	{
		if (m_cacheDatas.getPackage(temp))
		{
			printf("recv: %s\n", temp.c_str());

			if (temp == "-1")
				break;
		}
		else
		{
			Sleep(10);
		}
	}

	testThread.wait();

	return 0;
}

模版类


#pragma once

#include <string>
#include <queue>
#include <mutex>

template<class T>
class PackageCache final
{
public:

	void addData(const T& data)
	{
		m_mutex.lock();
		m_queueBackCache.emplace(std::move(data));
		m_mutex.unlock();
	}

	inline int getLen() { return (int)m_queueBackCache.size(); }

	bool getPackage(T& ret)
	{
		if (m_queueFrontCache.size() <= 0)
			moveData(m_queueFrontCache);

		bool bRet = false;

		if (m_queueFrontCache.size() > 0)
		{
			bRet = true;
			ret = std::move(m_queueFrontCache.front());
			m_queueFrontCache.pop();
		}

		return bRet;
	}

	template<class T1>
	void clear()
	{
		std::queue<T1> temp1;
		std::queue<T1> temp2;
		m_mutex.lock();
		m_queueBackCache = std::move(temp1);
		m_queueFrontCache = std::move(temp1);
		m_mutex.unlock();
	}

protected:
	bool moveData(std::queue<T>& ret)
	{
		bool bRet = false;

		m_mutex.lock();
		if (m_queueBackCache.size() > 0)
		{
			ret = std::move(m_queueBackCache);
			bRet = true;
		}
		m_mutex.unlock();

		return bRet;
	}

protected:
	std::queue<T>	    m_queueBackCache;
	std::queue<T>		m_queueFrontCache;
	std::mutex			m_mutex;
};

  • 53
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优秀会上瘾

缺少的是时间,从来不是金钱.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值