00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _pthreadpool_h_
00021 #define _pthreadpool_h_
00022
00023 #include <pclasses/pexport.h>
00024 #include <pclasses/pthread_.h>
00025 #include <pclasses/psemaphore.h>
00026 #include <pclasses/pcriticalsection.h>
00027 #include <pclasses/psignal.h>
00028 #include <queue>
00029 #include <list>
00030
00031 namespace P {
00032
00033 class ThreadPool;
00034 class WorkerThread;
00035
00036 class CXX_CLASS_EXPORT ThreadJob {
00037 friend class WorkerThread;
00038
00039 public:
00040 ThreadJob();
00041 virtual ~ThreadJob();
00042
00043 void wait();
00044 void tryWait();
00045
00046 Signal0<int> sigMain;
00047
00048 protected:
00049 virtual void main();
00050 void finished();
00051
00052 private:
00053 Semaphore m_lock;
00054
00055 };
00056
00057 class CXX_CLASS_EXPORT ThreadPool {
00058 friend class WorkerThread;
00059
00060 public:
00061 ThreadPool(unsigned int numThreadsInit, unsigned int numThreadsMaxIdle,
00062 unsigned int numThreadsMax);
00063 ~ThreadPool();
00064
00065 void enqueue(ThreadJob* job);
00066
00067 protected:
00068 void finished(WorkerThread* worker);
00069
00070 private:
00071 CriticalSection m_lock;
00072 Semaphore m_threadStartSem;
00073 unsigned int m_numThreads;
00074 unsigned int m_numThreadsMaxIdle;
00075 unsigned int m_numThreadsMax;
00076 unsigned int m_numThreadsIdle;
00077 std::queue<
00078 ThreadJob*> m_jobs;
00079 std::queue<
00080 WorkerThread*> m_idle;
00081
00082 };
00083
00084 }
00085
00086 #endif