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;
};