156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#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/csbl/memory/unique_ptr.hpp>
 | 
						|
#include <boost/thread/shared_mutex.hpp>
 | 
						|
#include <boost/thread/mutex.hpp>
 | 
						|
#include <boost/thread/lock_guard.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;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        bool is_this_thread_in()
 | 
						|
        {
 | 
						|
            thread::id id = this_thread::get_id();
 | 
						|
            boost::shared_lock<shared_mutex> guard(m);
 | 
						|
            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
 | 
						|
                it!=end;
 | 
						|
                ++it)
 | 
						|
            {
 | 
						|
              if ((*it)->get_id() == id)
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        bool is_thread_in(thread* thrd)
 | 
						|
        {
 | 
						|
          if(thrd)
 | 
						|
          {
 | 
						|
            thread::id id = thrd->get_id();
 | 
						|
            boost::shared_lock<shared_mutex> guard(m);
 | 
						|
            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
 | 
						|
                it!=end;
 | 
						|
                ++it)
 | 
						|
            {
 | 
						|
              if ((*it)->get_id() == id)
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            return false;
 | 
						|
          }
 | 
						|
          else
 | 
						|
          {
 | 
						|
            return false;
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        template<typename F>
 | 
						|
        thread* create_thread(F threadfunc)
 | 
						|
        {
 | 
						|
            boost::lock_guard<shared_mutex> guard(m);
 | 
						|
            boost::csbl::unique_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_THREAD_ASSERT_PRECONDITION( ! is_thread_in(thrd) ,
 | 
						|
                    thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying to add a duplicated thread")
 | 
						|
                );
 | 
						|
 | 
						|
                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_THREAD_ASSERT_PRECONDITION( ! is_this_thread_in() ,
 | 
						|
                thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying joining itself")
 | 
						|
            );
 | 
						|
            boost::shared_lock<shared_mutex> guard(m);
 | 
						|
 | 
						|
            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
 | 
						|
                it!=end;
 | 
						|
                ++it)
 | 
						|
            {
 | 
						|
              if ((*it)->joinable())
 | 
						|
                (*it)->join();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
 | 
						|
        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();
 | 
						|
            }
 | 
						|
        }
 | 
						|
#endif
 | 
						|
 | 
						|
        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
 |