Chris@16
|
1 #ifndef BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
|
Chris@16
|
2 #define BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
4 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 // (C) Copyright 2007-9 Anthony Williams
|
Chris@16
|
7
|
Chris@16
|
8 #include <list>
|
Chris@16
|
9 #include <boost/thread/shared_mutex.hpp>
|
Chris@16
|
10 #include <boost/thread/mutex.hpp>
|
Chris@16
|
11 #include <boost/thread/lock_guard.hpp>
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/config/abi_prefix.hpp>
|
Chris@16
|
14
|
Chris@16
|
15 #ifdef BOOST_MSVC
|
Chris@16
|
16 #pragma warning(push)
|
Chris@16
|
17 #pragma warning(disable:4251)
|
Chris@16
|
18 #endif
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost
|
Chris@16
|
21 {
|
Chris@16
|
22 class thread_group
|
Chris@16
|
23 {
|
Chris@16
|
24 private:
|
Chris@16
|
25 thread_group(thread_group const&);
|
Chris@16
|
26 thread_group& operator=(thread_group const&);
|
Chris@16
|
27 public:
|
Chris@16
|
28 thread_group() {}
|
Chris@16
|
29 ~thread_group()
|
Chris@16
|
30 {
|
Chris@16
|
31 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
Chris@16
|
32 it!=end;
|
Chris@16
|
33 ++it)
|
Chris@16
|
34 {
|
Chris@16
|
35 delete *it;
|
Chris@16
|
36 }
|
Chris@16
|
37 }
|
Chris@16
|
38
|
Chris@16
|
39 bool is_this_thread_in()
|
Chris@16
|
40 {
|
Chris@16
|
41 thread::id id = this_thread::get_id();
|
Chris@16
|
42 boost::shared_lock<shared_mutex> guard(m);
|
Chris@16
|
43 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
Chris@16
|
44 it!=end;
|
Chris@16
|
45 ++it)
|
Chris@16
|
46 {
|
Chris@16
|
47 if ((*it)->get_id() == id)
|
Chris@16
|
48 return true;
|
Chris@16
|
49 }
|
Chris@16
|
50 return false;
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 bool is_thread_in(thread* thrd)
|
Chris@16
|
54 {
|
Chris@16
|
55 if(thrd)
|
Chris@16
|
56 {
|
Chris@16
|
57 thread::id id = thrd->get_id();
|
Chris@16
|
58 boost::shared_lock<shared_mutex> guard(m);
|
Chris@16
|
59 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
Chris@16
|
60 it!=end;
|
Chris@16
|
61 ++it)
|
Chris@16
|
62 {
|
Chris@16
|
63 if ((*it)->get_id() == id)
|
Chris@16
|
64 return true;
|
Chris@16
|
65 }
|
Chris@16
|
66 return false;
|
Chris@16
|
67 }
|
Chris@16
|
68 else
|
Chris@16
|
69 {
|
Chris@16
|
70 return false;
|
Chris@16
|
71 }
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 template<typename F>
|
Chris@16
|
75 thread* create_thread(F threadfunc)
|
Chris@16
|
76 {
|
Chris@16
|
77 boost::lock_guard<shared_mutex> guard(m);
|
Chris@16
|
78 std::auto_ptr<thread> new_thread(new thread(threadfunc));
|
Chris@16
|
79 threads.push_back(new_thread.get());
|
Chris@16
|
80 return new_thread.release();
|
Chris@16
|
81 }
|
Chris@16
|
82
|
Chris@16
|
83 void add_thread(thread* thrd)
|
Chris@16
|
84 {
|
Chris@16
|
85 if(thrd)
|
Chris@16
|
86 {
|
Chris@16
|
87 BOOST_THREAD_ASSERT_PRECONDITION( ! is_thread_in(thrd) ,
|
Chris@101
|
88 thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying to add a duplicated thread")
|
Chris@16
|
89 );
|
Chris@16
|
90
|
Chris@16
|
91 boost::lock_guard<shared_mutex> guard(m);
|
Chris@16
|
92 threads.push_back(thrd);
|
Chris@16
|
93 }
|
Chris@16
|
94 }
|
Chris@16
|
95
|
Chris@16
|
96 void remove_thread(thread* thrd)
|
Chris@16
|
97 {
|
Chris@16
|
98 boost::lock_guard<shared_mutex> guard(m);
|
Chris@16
|
99 std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd);
|
Chris@16
|
100 if(it!=threads.end())
|
Chris@16
|
101 {
|
Chris@16
|
102 threads.erase(it);
|
Chris@16
|
103 }
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 void join_all()
|
Chris@16
|
107 {
|
Chris@16
|
108 BOOST_THREAD_ASSERT_PRECONDITION( ! is_this_thread_in() ,
|
Chris@101
|
109 thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying joining itself")
|
Chris@16
|
110 );
|
Chris@16
|
111 boost::shared_lock<shared_mutex> guard(m);
|
Chris@16
|
112
|
Chris@16
|
113 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
Chris@16
|
114 it!=end;
|
Chris@16
|
115 ++it)
|
Chris@16
|
116 {
|
Chris@16
|
117 if ((*it)->joinable())
|
Chris@16
|
118 (*it)->join();
|
Chris@16
|
119 }
|
Chris@16
|
120 }
|
Chris@16
|
121
|
Chris@16
|
122 #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
Chris@16
|
123 void interrupt_all()
|
Chris@16
|
124 {
|
Chris@16
|
125 boost::shared_lock<shared_mutex> guard(m);
|
Chris@16
|
126
|
Chris@16
|
127 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
Chris@16
|
128 it!=end;
|
Chris@16
|
129 ++it)
|
Chris@16
|
130 {
|
Chris@16
|
131 (*it)->interrupt();
|
Chris@16
|
132 }
|
Chris@16
|
133 }
|
Chris@16
|
134 #endif
|
Chris@16
|
135
|
Chris@16
|
136 size_t size() const
|
Chris@16
|
137 {
|
Chris@16
|
138 boost::shared_lock<shared_mutex> guard(m);
|
Chris@16
|
139 return threads.size();
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@16
|
142 private:
|
Chris@16
|
143 std::list<thread*> threads;
|
Chris@16
|
144 mutable shared_mutex m;
|
Chris@16
|
145 };
|
Chris@16
|
146 }
|
Chris@16
|
147
|
Chris@16
|
148 #ifdef BOOST_MSVC
|
Chris@16
|
149 #pragma warning(pop)
|
Chris@16
|
150 #endif
|
Chris@16
|
151
|
Chris@16
|
152 #include <boost/config/abi_suffix.hpp>
|
Chris@16
|
153
|
Chris@16
|
154 #endif
|