Skip to content

Instantly share code, notes, and snippets.

@pocarist
Created October 31, 2014 09:13
Show Gist options
  • Save pocarist/0333f77ed64884950aac to your computer and use it in GitHub Desktop.
Save pocarist/0333f77ed64884950aac to your computer and use it in GitHub Desktop.
#include <condition_variable>
#include <mutex>
#include <queue>
template <typename T>
class blockingqueue {
public:
blockingqueue() {}
void enqueue(const T& item) {
std::lock_guard<std::mutex> lk(lk_);
const bool was_empty = queue_.empty();
queue_.push(item);
if (was_empty) {
empty_wait_.notify_all(); // notify_one() may be suitable?
}
}
T dequeue() {
std::unique_lock<std::mutex> lk(lk_);
while (queue_.empty()) {
empty_wait_.wait(lk);
}
T result = queue_.front();
queue_.pop();
return result;
}
size_t size() const {
boost::mutex::scoped_lock lk(lk_);
return queue_.size();
}
private:
mutable std::mutex lk_;
mutable std::condition_variable empty_wait_;
std::queue<T> queue_;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment