1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

queue: fix races

This commit is contained in:
Steffen Vogel 2018-12-04 00:31:21 +01:00
parent c7f738b413
commit a1dce81361
2 changed files with 12 additions and 13 deletions

View file

@ -24,7 +24,6 @@
#pragma once
#include <mutex>
#include <condition_variable>
#include <queue>
namespace villas {
@ -34,15 +33,20 @@ class Queue {
protected:
std::queue<T> queue;
std::mutex mtx;
public:
void push(T p)
{
std::unique_lock<std::mutex> guard(mtx);
queue.push(p);
}
T pop()
{
std::unique_lock<std::mutex> guard(mtx);
T res = queue.front();
queue.pop();
@ -51,6 +55,8 @@ public:
bool empty()
{
std::unique_lock<std::mutex> guard(mtx);
return queue.empty();
}

View file

@ -34,14 +34,11 @@ template<typename T>
class QueueSignalled : public Queue<T> {
private:
std::mutex mutex;
std::condition_variable cv;
public:
void push(const T& data)
{
std::lock_guard<std::mutex> l(mutex);
Queue<T>::push(data);
cv.notify_one();
@ -49,19 +46,15 @@ public:
T pop()
{
std::unique_lock<std::mutex> l(mutex);
std::unique_lock<std::mutex> l(Queue<T>::mtx);
while (Queue<T>::empty())
while (Queue<T>::queue.empty())
cv.wait(l);
return Queue<T>::pop();
}
T res = Queue<T>::queue.front();
Queue<T>::queue.pop();
bool empty()
{
std::unique_lock<std::mutex> l(mutex);
return Queue<T>::empty();
return res;
}
};