Listing 3
class last_call : public simple_call
{
virtual bool invoke()
{ return false; }
virtual bool is_completed()
const { return false; }
virtual void wait_completion() {}
virtual last_call* make_clone() const
{ return new last_call; }
};
class thread_pool
{
public:
explicit thread_pool(unsigned int
threads)
: _threads(threads)
{
for(unsigned int i = 0; i != _threads; ++i)
_thread_group.create_thread(&thread_func);
}
~thread_pool()
{
try
{
work_queue& wq = work_queue::instance();
for(unsigned int i = 0; i != _threads; ++i)
wq.queue_item(shared_ptr<simple_call>
(new last_call));
_thread_group.join_all();
}
catch(...) {}
}
static void thread_func()
{
work_queue& wq = work_queue::instance();
bool keep_processing = true;
while(keep_processing)
{
shared_ptr<simple_call> call = wq.dequeue_item();
try
{
keep_processing = call->invoke();
}
catch(...) {}
}
}
private:
unsigned int _threads;
thread_group _thread_group;
};