mirror of
https://github.com/Ryuzaki-MrL/savemii.git
synced 2026-03-26 12:06:17 -05:00
60 lines
1.2 KiB
C++
60 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <condition_variable>
|
|
#include <mutex>
|
|
#include <queue>
|
|
|
|
template<typename T>
|
|
class LockingQueue {
|
|
public:
|
|
void push(T const &_data) {
|
|
{
|
|
std::lock_guard<std::mutex> lock(guard);
|
|
queue.push(_data);
|
|
}
|
|
signal.notify_one();
|
|
}
|
|
|
|
bool empty() const {
|
|
std::lock_guard<std::mutex> lock(guard);
|
|
return queue.empty();
|
|
}
|
|
|
|
bool tryPop(T &_value) {
|
|
std::lock_guard<std::mutex> lock(guard);
|
|
if (queue.empty()) {
|
|
return false;
|
|
}
|
|
|
|
_value = queue.front();
|
|
queue.pop();
|
|
return true;
|
|
}
|
|
|
|
void waitAndPop(T &_value) {
|
|
std::unique_lock<std::mutex> lock(guard);
|
|
while (queue.empty()) {
|
|
signal.wait(lock);
|
|
}
|
|
|
|
_value = queue.front();
|
|
queue.pop();
|
|
}
|
|
|
|
bool tryWaitAndPop(T &_value, int _milli) {
|
|
std::unique_lock<std::mutex> lock(guard);
|
|
while (queue.empty()) {
|
|
signal.wait_for(lock, std::chrono::milliseconds(_milli));
|
|
return false;
|
|
}
|
|
|
|
_value = queue.front();
|
|
queue.pop();
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
std::queue<T> queue;
|
|
mutable std::mutex guard;
|
|
std::condition_variable signal;
|
|
}; |