Listing 4
class work_queue
{
public:
~work_queue() {};
static work_queue& instance();
void queue_item(const shared_ptr<simple_call>& call)
{
mutex::scoped_lock lk(_mx);
_calls.push_back(call);
_not_empty.notify_one();
}
shared_ptr<simple_call> dequeue_item()
{
mutex::scoped_lock lk(_mx);
not_empty ne(_calls);
if(!ne())
_not_empty.wait(lk, ne);
shared_ptr<simple_call> call = *_calls.begin();
_calls.pop_front();
return call;
}
protected:
typedef std::list<shared_ptr<simple_call> > calls;
calls _calls;
private:
// not_empty, unary function returns !_calls.empty()
work_queue() {}
work_queue(const work_queue& other); // not implemented
condition _not_empty;
mutex _mx;
};