1 #ifndef GENESIS_UTILS_THREADING_THREADSAFE_QUEUE_H_
2 #define GENESIS_UTILS_THREADING_THREADSAFE_QUEUE_H_
64 #include <condition_variable>
102 std::lock_guard<std::mutex> lk( other.mutex_ );
103 data_queue_ = other.data_queue_;
108 std::lock_guard<std::mutex> lk(other.mutex_);
109 data_queue_ = std::move( other.data_queue_ );
114 if( &other ==
this ) {
121 std::lock(mutex_, other.mutex_);
122 std::lock_guard<std::mutex> lhs_lk(mutex_, std::adopt_lock);
123 std::lock_guard<std::mutex> rhs_lk(other.mutex_, std::adopt_lock);
125 data_queue_ = other.data_queue_;
131 if( &other ==
this ) {
136 std::lock(mutex_, other.mutex_);
137 std::lock_guard<std::mutex> lhs_lk(mutex_, std::adopt_lock);
138 std::lock_guard<std::mutex> rhs_lk(other.mutex_, std::adopt_lock);
139 data_queue_ = std::move( other.data_queue_ );
149 std::lock_guard<std::mutex> lk(mutex_);
150 data_queue_.push( std::move( new_value ));
151 data_cond_.notify_one();
156 std::unique_lock<std::mutex> lk(mutex_);
157 data_cond_.wait(lk, [
this] {
return !data_queue_.empty(); });
158 value = std::move( data_queue_.front() );
164 std::unique_lock<std::mutex> lk(mutex_);
165 data_cond_.wait(lk, [
this] {
return !data_queue_.empty(); });
166 std::shared_ptr<T> res(std::make_shared<T>(data_queue_.front()));
173 std::lock_guard<std::mutex> lk(mutex_);
174 if( data_queue_.empty() ) {
177 value = std::move( data_queue_.front() );
184 std::lock_guard<std::mutex> lk(mutex_);
185 if( data_queue_.empty() ) {
186 return std::shared_ptr<T>();
188 std::shared_ptr<T> res(std::make_shared<T>(data_queue_.front()));
195 std::lock_guard<std::mutex> lk(mutex_);
196 return data_queue_.empty();
201 mutable std::mutex mutex_;
202 std::queue<T> data_queue_;
203 std::condition_variable data_cond_;
407 #endif // include guard