#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 #include #include #include #ifdef BOOST_MSVC #pragma warning(push) #pragma warning(disable:4251) #endif namespace boost { class thread_group: private noncopyable { public: ~thread_group() { for(std::list::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { delete *it; } } template thread* create_thread(F threadfunc) { boost::lock_guard guard(m); std::auto_ptr 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 guard(m); threads.push_back(thrd); } } void remove_thread(thread* thrd) { boost::lock_guard guard(m); std::list::iterator const it=std::find(threads.begin(),threads.end(),thrd); if(it!=threads.end()) { threads.erase(it); } } void join_all() { boost::shared_lock guard(m); for(std::list::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { (*it)->join(); } } void interrupt_all() { boost::shared_lock guard(m); for(std::list::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { (*it)->interrupt(); } } size_t size() const { boost::shared_lock guard(m); return threads.size(); } private: std::list threads; mutable shared_mutex m; }; } #ifdef BOOST_MSVC #pragma warning(pop) #endif #include #endif