Код: Выделить всё
template
class ThreadSafeQueue {
private:
mutable std::mutex mut;
std::queue data_queue;
std::condition_variable cv;
public:
ThreadSafeQueue() {}
void wait_and_pop(T& val) {
std::unique_lock lk(mut);
cv.wait(lk, [this] { return !data_queue.empty(); });
val = std::move(*data_queue.front());
data_queue.pop();
}
bool try_pop(T& val) {
std::lock_guard lk(mut);
if (data_queue.empty()) {
return false;
}
val = std::move(*data_queue.front());
data_queue.pop();
return true;
}
std::shared_ptr wait_and_pop() {
std::unique_lock lk(mut);
cv.wait(lk, [this] { return !data_queue.empty(); });
std::shared_ptr res = data_queue.front();
data_queue.pop();
return res;
}
std::shared_ptr try_pop() {
std::lock_guard lk(mut);
if (data_queue.empty()) {
return std::shared_ptr();
}
std::shared_ptr res = data_queue.front();
data_queue.pop();
return res;
}
void push(T val) {
std::shared_ptr data(std::make_shared(std::move(val)));
std::lock_guard lk(mut);
data_queue.push(data);
cv.notify_one();
}
bool empty() const {
std::lock_guard lk(mut);
return data_queue.empty();
}
}; // class ThreadSafeQueue
Код: Выделить всё
template
class ThreadSafeQueue {
private:
mutable std::mutex mut;
std::queue data_queue;
std::condition_variable cv;
public:
ThreadSafeQueue() {}
void wait_and_pop(T& val) {
std::unique_lock lk(mut);
cv.wait(lk, [this] { return !data_queue.empty(); });
val = std::move(data_queue.front());
data_queue.pop();
}
bool try_pop(T& val) {
std::lock_guard lk(mut);
if (data_queue.empty()) {
return false;
}
val = std::move(data_queue.front());
data_queue.pop();
return true;
}
T wait_and_pop() {
std::unique_lock lk(mut);
cv.wait(lk, [this] { return !data_queue.empty(); });
T res = std::move(data_queue.front());
data_queue.pop();
return res;
}
std::optional try_pop() {
std::lock_guard lk(mut);
if (data_queue.empty()) {
return std::optional();
}
std::optional res = std::move(data_queue.front());
data_queue.pop();
return res;
}
void push(T val) {
std::lock_guard lk(mut);
data_queue.push(std::move(val));
cv.notify_one();
}
bool empty() const {
std::lock_guard lk(mut);
return data_queue.empty();
}
}; // class ThreadSafeQueue
Подробнее здесь: https://stackoverflow.com/questions/795 ... safe-queue
Мобильная версия