#ifndef BOOST_THREAD_DETAIL_THREAD_GROUP_HPP | |
#define BOOST_THREAD_DETAIL_THREAD_GROUP_HPP | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// (C) Copyright 2007-9 Anthony Williams | |
#include <list> | |
#include <boost/thread/shared_mutex.hpp> | |
#include <boost/thread/mutex.hpp> | |
#include <boost/config/abi_prefix.hpp> | |
#ifdef BOOST_MSVC | |
#pragma warning(push) | |
#pragma warning(disable:4251) | |
#endif | |
namespace boost | |
{ | |
class thread_group | |
{ | |
private: | |
thread_group(thread_group const&); | |
thread_group& operator=(thread_group const&); | |
public: | |
thread_group() {} | |
~thread_group() | |
{ | |
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); | |
it!=end; | |
++it) | |
{ | |
delete *it; | |
} | |
} | |
template<typename F> | |
thread* create_thread(F threadfunc) | |
{ | |
boost::lock_guard<shared_mutex> guard(m); | |
std::auto_ptr<thread> new_thread(new thread(threadfunc)); | |
threads.push_back(new_thread.get()); | |
return new_thread.release(); | |
} | |
void add_thread(thread* thrd) | |
{ | |
if(thrd) | |
{ | |
boost::lock_guard<shared_mutex> guard(m); | |
threads.push_back(thrd); | |
} | |
} | |
void remove_thread(thread* thrd) | |
{ | |
boost::lock_guard<shared_mutex> guard(m); | |
std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd); | |
if(it!=threads.end()) | |
{ | |
threads.erase(it); | |
} | |
} | |
void join_all() | |
{ | |
boost::shared_lock<shared_mutex> guard(m); | |
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); | |
it!=end; | |
++it) | |
{ | |
(*it)->join(); | |
} | |
} | |
void interrupt_all() | |
{ | |
boost::shared_lock<shared_mutex> guard(m); | |
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); | |
it!=end; | |
++it) | |
{ | |
(*it)->interrupt(); | |
} | |
} | |
size_t size() const | |
{ | |
boost::shared_lock<shared_mutex> guard(m); | |
return threads.size(); | |
} | |
private: | |
std::list<thread*> threads; | |
mutable shared_mutex m; | |
}; | |
} | |
#ifdef BOOST_MSVC | |
#pragma warning(pop) | |
#endif | |
#include <boost/config/abi_suffix.hpp> | |
#endif |