thread_pool/pool/TaskQueue.h
2023-04-13 13:04:52 +08:00

80 lines
1.6 KiB
C++

//
// Created by dongl on 23-4-12.
//
#ifndef THREAD_POOL_V2_TASKQUEUE_H
#define THREAD_POOL_V2_TASKQUEUE_H
#include <queue>
#include <mutex>
#include <functional>
#include "event.h"
template<typename T>
class TaskQueue {
public:
TaskQueue() {}
TaskQueue(TaskQueue&& taskQueue) {}
~TaskQueue() {}
public:
bool empty() {
std::unique_lock<std::mutex> lock(m_mutex);
return m_queue.empty();
}
int size() {
std::unique_lock<std::mutex> lock(m_mutex);
return m_queue.empty();
}
void press(T& t) {
std::unique_lock<std::mutex> lock(m_mutex);
m_queue.emplace(t);
}
bool eject(T& t) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_queue.empty()) return false;
t = event(std::move(m_queue.front()));
m_queue.pop();
return true;
}
bool ejects(std::queue<event>& ts, size_t size) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_queue.empty()) return false;
for (int i = 0; i < size; ++i) {
ts.emplace(std::move(event(index++, m_queue.front())));
m_queue.pop();
}
return true;
}
bool sub_swap(TaskQueue<event>& dest, size_t size) {
std::queue<event> queue;
bool st = this->ejects(queue, size);
if (!st) {
return st;
} else {
for (int i = 0; i < size; ++i) {
dest.press(queue.front());
queue.pop();
}
}
return st;
}
private:
std::queue<T> m_queue;
std::mutex m_mutex;
size_t index = 0;
};
#endif //THREAD_POOL_V2_TASKQUEUE_H