19 #ifndef INCLUDE_RCF_THREADMANAGER_HPP
20 #define INCLUDE_RCF_THREADMANAGER_HPP
24 #include <boost/bind.hpp>
25 #include <boost/cstdint.hpp>
26 #include <boost/enable_shared_from_this.hpp>
27 #include <boost/function.hpp>
28 #include <boost/shared_ptr.hpp>
30 #include <RCF/AsioFwd.hpp>
31 #include <RCF/Export.hpp>
32 #include <RCF/ThreadLibrary.hpp>
33 #include <RCF/Timer.hpp>
34 #include <RCF/Tools.hpp>
45 typedef boost::function1<void, int> Task;
47 typedef boost::function0<void> StopFunctor;
50 typedef boost::shared_ptr<ThreadPool> ThreadPoolPtr;
54 typedef boost::shared_ptr<ThreadPool> ThreadPoolPtr;
57 class RCF_EXPORT ThreadInfo
60 ThreadInfo(ThreadPool & threadPool);
63 ThreadPool & getThreadPool();
66 friend class ThreadPool;
67 friend class ShouldStop;
69 ThreadPool & mThreadPool;
72 RCF::Timer mTouchTimer;
75 typedef boost::shared_ptr<ThreadInfo> ThreadInfoPtr;
83 static const MuxerType DefaultMuxerType = Mt_Asio;
87 public boost::enable_shared_from_this<ThreadPool>
91 typedef boost::function0<void> ThreadInitFunctor;
92 typedef boost::function0<void> ThreadDeinitFunctor;
97 ThreadPool(std::size_t threadMinCount, std::size_t threadMaxCount);
100 void setThreadMinCount(std::size_t threadMinCount);
103 std::size_t getThreadMinCount()
const;
106 void setThreadMaxCount(std::size_t threadMaxCount);
109 std::size_t getThreadMaxCount()
const;
114 void setThreadIdleTimeoutMs(boost::uint32_t threadIdleTimeoutMs);
117 boost::uint32_t getThreadIdleTimeoutMs()
const;
122 void setReserveLastThread(
bool reserveLastThread);
123 bool getReserveLastThread()
const;
126 void setThreadName(
const std::string & threadName);
129 std::string getThreadName()
const;
140 void addThreadInitFunctor(
141 ThreadInitFunctor threadInitFunctor);
143 void addThreadDeinitFunctor(
144 ThreadDeinitFunctor threadDeinitFunctor);
146 AsioIoService * getIoService();
150 std::size_t getThreadCount();
152 void setTask(Task task);
153 void setStopFunctor(StopFunctor stopFunctor);
155 void enableMuxerType(MuxerType muxerType);
159 bool shouldStop()
const;
165 void setMyThreadName();
167 bool launchThread(std::size_t howManyThreads = 1);
172 RCF::ThreadInfoPtr threadInfoPtr,
175 void cycle(
int timeoutMs, ShouldStop & shouldStop);
177 friend class TaskEntry;
178 friend class RcfServer;
180 mutable Mutex mInitDeinitMutex;
181 std::vector<ThreadInitFunctor> mThreadInitFunctors;
182 std::vector<ThreadDeinitFunctor> mThreadDeinitFunctors;
183 std::string mThreadName;
184 boost::shared_ptr<AsioMuxer> mAsioIoServicePtr;
187 std::size_t mThreadMinCount;
188 std::size_t mThreadMaxCount;
189 bool mReserveLastThread;
190 boost::uint32_t mThreadIdleTimeoutMs;
193 StopFunctor mStopFunctor;
197 typedef std::map<ThreadInfoPtr, ThreadPtr> ThreadMap;
201 std::size_t mBusyCount;
204 class ThreadTouchGuard
210 ThreadInfoPtr mThreadInfoPtr;
218 ThreadInfoPtr threadInfoPtr);
220 bool operator()()
const;
223 friend class ThreadPool;
225 ThreadInfoPtr mThreadInfoPtr;
228 RCF_EXPORT
void setWin32ThreadName(
const std::string & threadName);
232 #endif // ! INCLUDE_RCF_THREADMANAGER_HPP