15 #ifndef BORNAGAIN_MVVM_MODEL_MVVM_UTILS_THREADSAFESTACK_H
16 #define BORNAGAIN_MVVM_MODEL_MVVM_UTILS_THREADSAFESTACK_H
18 #include "mvvm/model_export.h"
20 #include <condition_variable>
34 const char*
what() const noexcept {
return "Empty stack"; }
53 std::lock_guard<std::mutex> lock(
m);
60 std::lock_guard<std::mutex> lock(
m);
61 data.push(std::move(new_value));
69 std::lock_guard<std::mutex> lock(
m);
72 data.push(std::move(new_value));
78 std::unique_lock<std::mutex> lock(
m);
82 value = std::move(
data.top());
88 std::unique_lock<std::mutex> lock(
m);
92 std::shared_ptr<T>
const res(std::make_shared<T>(std::move(
data.top())));
99 std::lock_guard<std::mutex> lock(
m);
102 value = std::move(
data.top());
109 std::lock_guard<std::mutex> lock(
m);
111 return std::shared_ptr<T>();
112 std::shared_ptr<T> res(std::make_shared<T>(std::move(
data.top())));
119 std::lock_guard<std::mutex> lock(
m);
127 std::lock_guard<std::mutex> lock(
m);
Thread-safe stack borrowed from Anthony Williams, C++ Concurrency in Action, Second edition.
std::atomic< bool > in_waiting_state
void update_top(T new_value)
Updates top value in a stack.
void stop()
Terminates waiting in wait_and_pop methods.
std::shared_ptr< T > wait_and_pop()
std::condition_variable data_condition
std::shared_ptr< T > try_pop()
threadsafe_stack & operator=(const threadsafe_stack &other)=delete
void wait_and_pop(T &value)
threadsafe_stack(const threadsafe_stack &other)
materialitems.h Collection of materials to populate MaterialModel.
const char * what() const noexcept