循环队列,支持多线程
- static const char S_FILL[] = "cycle_queue_fill_";
- static const char S_EMPTY[] = "cycle_queue_empty_";
- template<class T>
- class CycleQueueT
- {
- private:
- CycleQueueT(const CycleQueueT&);
- CycleQueueT& operator= (const CycleQueueT&);
- public:
- CycleQueueT(T *buffer, unsigned int count, const std::string &strConnectName)
- : count_(count)
- , front_(0)
- , rear_(0)
- , writePtr_(buffer)
- , readPtr_(buffer)
- , hFill_(NULL)
- , hEmpty_(NULL)
- {
- hFill_ = CreateSemaphoreA(NULL, count_, count_, (strConnectName+S_FILL).c_str());
- hEmpty_ = CreateSemaphoreA(NULL, 0, count_, (strConnectName+S_EMPTY).c_str());
- }
- void set(T *buffer, bool blWrite)
- {
- assert(NULL != buffer);
- if (blWrite){
- writePtr_ = buffer;
- }
- else{
- readPtr_ = buffer;
- }
- }
- void put(const T *elem)
- {
- WaitForSingleObject(hFill_, INFINITE);
- memcpy(writePtr_+rear_, elem, sizeof(T));
- rear_ = (rear_ + 1) % count_;
- ReleaseSemaphore(hEmpty_, 1, NULL);
- }
- void get(T *elem)
- {
- WaitForSingleObject(hEmpty_, INFINITE);
- memcpy(elem, readPtr_+front_, sizeof(T));
- front_ = (front_ + 1) % count_;
- ReleaseSemaphore(hFill_, 1, NULL);
- }
- unsigned int size() const
- {
- return (rear_ - front_ + count_) % count_;
- }
- private:
- unsigned int count_;
- unsigned int front_;
- unsigned int rear_;
- T *writePtr_;
- T *readPtr_;
- void *hFill_;
- void *hEmpty_;
- };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人