赞
踩
头文件:更新了下 添加了一个析构时 调用回调函数 供 用户释放资源 不用使用场景下 销毁资源的方式不一样 所以设置了一个回调函数 这样不用的 场景 将销毁资源的方式交给用户
真是妙啊 !!!! PopData那个有问题 请使用 wait_and_pop那个
- #pragma once
-
- #include <mutex>
- #include <queue>
- #include <functional>
- #include <future>
- #include <thread>
- #include <utility>
- #include <vector>
-
- #include <condition_variable>
-
-
- typedef void(*PFEXIT)(void *param);
-
- class SafeQueue
- {
- private:
- std::queue<void *> m_queue; //利用模板函数构造队列
- mutable std::mutex m_mutex; // 访问互斥信号量
- mutable std::condition_variable data_cond;
- int m_max_size = 5;
- PFEXIT m_clean = NULL;
- public:
- SafeQueue() ;
- SafeQueue(int size) ;
- SafeQueue(SafeQueue &&other);
- ~SafeQueue();
-
- bool isEmpty();
- int GetSize();
- void SetCleanFunction(PFEXIT func);
- bool PushData(void *data);
- bool PopData(void *data)=delete;
- void * wait_and_pop();
- };

源文件:
-
- #pragma once
-
- #include <queue>
- #include <mutex>
- #include <condition_variable>
- #include <initializer_list>
-
-
- #include "safequeue.h"
-
- #include <iostream>
-
- using namespace std;
-
- SafeQueue::SafeQueue()
- {
- cout<<__FUNCTION__;
- }
-
-
-
-
- SafeQueue::SafeQueue(int size)
- {
- m_max_size = size;
- cout<<__FUNCTION__<<endl;
- }
-
- SafeQueue::SafeQueue(SafeQueue &&other)
- {
-
- }
-
-
- SafeQueue::~SafeQueue()
- {
- std::unique_lock<std::mutex> lock(m_mutex);
- std::cout<<__FUNCTION__<<"queue size:"<<m_queue.size()<<endl;
-
- while (m_queue.size())
- {
- auto data = std::move(m_queue.front());
- m_queue.pop();
- if(m_clean)
- {
- m_clean(data);
- }
- }
-
-
-
-
-
- }
-
- void SafeQueue::SetCleanFunction(PFEXIT func)
- {
- m_clean = func;
- }
-
- bool SafeQueue::isEmpty()
- {
- std::unique_lock<std::mutex> lock(m_mutex);
- return m_queue.empty();
- }
-
- bool SafeQueue::PushData(void *data)
- {
- std::unique_lock<std::mutex> lock(m_mutex);
-
-
- if(m_queue.size() == m_max_size)
- {
- return false;
- }
- m_queue.emplace(data);
- data_cond.notify_one();
- return true;
- }
-
- bool SafeQueue::PopData(void *data)
- {
- std::unique_lock<std::mutex> lock(m_mutex);
-
- if (m_queue.empty())
- return false;
- data = std::move(m_queue.front());
-
- m_queue.pop();
-
- return true;
-
- }
-
- int SafeQueue::GetSize()
- {
- std::unique_lock<std::mutex> lock(m_mutex);
-
- return m_queue.size();
- }
-
- void * SafeQueue::wait_and_pop()
- {
- std::unique_lock<std::mutex> lock(m_mutex);
- data_cond.wait(lock,[this]{return !this->m_queue.empty();});
- if(m_queue.size() == 0)
- {
- return NULL;
- }
- else
- {
- auto value =std::move(m_queue.front());
- m_queue.pop();
- return value;
- }
- }
-
-

使用的时候 创建队列之后 指定对应的 回调函数 如下图:
这样delete 队列的时候就如果队列不为空就会走到这个函数里面 释放对应的资源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。