c++ 写一个TaskQueue类

编程入门 行业动态 更新时间:2024-10-26 14:34:48

c++ 写一个<a href=https://www.elefans.com/category/jswz/34/921094.html style=TaskQueue类"/>

c++ 写一个TaskQueue类

1:list 封装,采用c++11 条件变量
2:当没有数据时候,获取数据会卡住,当有数据时候自动唤醒

#ifndef TASKQUEUE_H_
#define TASKQUEUE_H_#include <stdio.h>
#include <list>
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <condition_variable>template<typename T>
class TaskQueue {
public:TaskQueue(int num){_maxNum = num;}template<typename C>void push_task(C&& task_func) {{std::lock_guard<std::mutex> lock(_mutex);if (_queue.size() >= _maxNum){// 丢弃return;}_queue.emplace_back(std::forward<C>(task_func));}_condition.notify_one();}template<typename C>void push_task_first(C&& task_func) {{std::lock_guard<std::mutex> lock(_mutex);if (_queue.size() >= _maxNum){// 丢弃return;}_queue.emplace_front(std::forward<C>(task_func));}_condition.notify_one();}bool get_task(T& tsk) {std::unique_lock<std::mutex> lock(_mutex);_condition.wait(lock, [&]()->bool { return !_queue.empty(); }); // suspend and wait ...															  //改成右值引用后性能提升了1倍多!//tsk = std::move(_queue.front());if (!_queue.empty()){tsk = _queue.front();_queue.pop_front();return true;}else{return false;}}uint64_t size()  {//std::lock_guard<decltype(_mutex)> lock(_mutex);std::lock_guard<std::mutex> lock(_mutex);return _queue.size();}void set_capacity(int num){std::lock_guard<std::mutex> lock(_mutex);_maxNum = num;}int capacity() {std::lock_guard<std::mutex> lock(_mutex);return _maxNum;}void clear(){std::lock_guard<std::mutex> lock(_mutex);_queue.clear();}
private:std::list<T> _queue;std::mutex _mutex;std::condition_variable _condition;int _maxNum;
};class TaskSleep
{
public:void SleepMs(int64_t delayMs){std::unique_lock<std::mutex> lock(_mutex);	_condition.wait_for(lock, std::chrono::milliseconds(delayMs), [&]()->bool {return !_queue.empty(); });if (!_queue.empty()){_queue.pop_front();}}void ExitSleep(){std::lock_guard<std::mutex> lock(_mutex);_queue.push_back('a');_condition.notify_one();}private:std::mutex _mutex;std::condition_variable _condition;std::list<char> _queue;
};#endif

更多推荐

c++ 写一个TaskQueue类

本文发布于:2023-12-03 07:04:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1652458.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:TaskQueue

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!