|
|
|
@ -51,11 +51,19 @@ threadpool::threadpool(unsigned int max_threads) : running(true), active(0) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
threadpool::~threadpool() {
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
const boost::unique_lock<boost::mutex> lock(mutex);
|
|
|
|
|
running = false;
|
|
|
|
|
has_work.notify_all();
|
|
|
|
|
}
|
|
|
|
|
catch (...)
|
|
|
|
|
{
|
|
|
|
|
// if the lock throws, we're just do it without a lock and hope,
|
|
|
|
|
// since the alternative is terminate
|
|
|
|
|
running = false;
|
|
|
|
|
has_work.notify_all();
|
|
|
|
|
}
|
|
|
|
|
for (size_t i = 0; i<threads.size(); i++) {
|
|
|
|
|
try { threads[i].join(); }
|
|
|
|
|
catch (...) { /* ignore */ }
|
|
|
|
@ -91,11 +99,13 @@ unsigned int threadpool::get_max_concurrency() const {
|
|
|
|
|
|
|
|
|
|
threadpool::waiter::~waiter()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
boost::unique_lock<boost::mutex> lock(mt);
|
|
|
|
|
if (num)
|
|
|
|
|
MERROR("wait should have been called before waiter dtor - waiting now");
|
|
|
|
|
}
|
|
|
|
|
catch (...) { /* ignore */ }
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
wait(NULL);
|
|
|
|
|