栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现阻塞队列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现阻塞队列

#ifndef BLCOKING_QUEUE_H
#define BLCOKING_QUEUE_H

#include 
#include 
#include 
#include 

template
class BlockingQueue {
public:
	BlockingQueue() = default;
	BlockingQueue(size_t maxSize) : maxSize_(maxSize) {}
	BlockingQueue(const BlockingQueue&) = default;

	 bool Pop(T& t) {
		std::unique_lock lock(mutex_);
		conditionVar_.wait(lock, [this]() { return !queue_.empty() || isStop_; });
		if (isStop_) {
			return false;
		}
		t = queue_.front();
		queue_.pop_front();
		conditionVar_.notify_one();
		return true;
	}

	bool Push(T elem) {
		std::unique_lock lock(mutex_);
		conditionVar_.wait(lock, [this]() { return (queue_.size() < maxSize_) || isStop_; });
		if (isStop_) {
			return false;
		}
		queue_.push_back(elem);
		conditionVar_.notify_one();
		return true;
	}

	void SetMaxSize(int size) {
		maxSize_ = size;
	}

	void Notify() {
		{
			std::unique_lock lock(mutex_);
			isStop_ = true;
		}
		conditionVar_.notify_all();
	}

	void Stop() {
		{
			std::unique_lock lock(mutex_);
			isStop_ = true;
		}
		conditionVar_.notify_all();
		queue_.clear();
	}

	void Start() {
		std::unique_lock lock(mutex_);
		isStop_ = false;
	}

	bool Empty() {
		std::unique_lock lock(mutex_);
		return queue_.empty();
	}

	size_t Size() {
		std::unique_lock lock(mutex_);
		return queue_.size();
	}

private:
	bool isStop_ = false;
	std::mutex mutex_;
	std::condition_variable conditionVar_;
	std::list queue_;
	size_t maxSize_ = 10;
};

#endif

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号