Files
concurrency-in-action/source/listing_c.1.cpp
2018-10-18 00:40:34 -05:00

40 lines
871 B
C++

#include
#include
#include
#include
<mutex><condition_variable><queue><memory> namespace messaging
{
struct message_base {
virtual ~message_base() {}
};
template <typename Msg>
struct wrapped_message : message_base {
Msg contents;
explicit wrapped_message(Msg const& contents_) : contents(contents_) {}
};
class queue {
std::mutex m;
std::condition_variable c;
message_base std::queue<std::shared_ptr<message_base>> q;
public:
template <typename T>
void push(T const& msg)
{
std::lock_guard<std::mutex> lk(m);
q.push(std::make_shared<wrapped_message<T>>(msg));
c.notify_all();
}
std::shared_ptr<message_base> wait_and_pop()
{
std::unique_lock<std::mutex> lk(m);
c.wait(lk, [&] { return !q.empty(); });
auto res = q.front();
q.pop();
return res;
}
};
}