123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #ifndef _RAR_THREADPOOL_
- #define _RAR_THREADPOOL_
- #ifndef RAR_SMP
- const uint MaxPoolThreads=1;
- #else
- const uint MaxPoolThreads=64;
- #ifdef _UNIX
- #include <pthread.h>
- #include <semaphore.h>
- #endif
- #define USE_THREADS
- #ifdef _UNIX
- #define NATIVE_THREAD_TYPE void*
- typedef void* (*NATIVE_THREAD_PTR)(void *Data);
- typedef pthread_t THREAD_HANDLE;
- typedef pthread_mutex_t CRITSECT_HANDLE;
- #else
- #define NATIVE_THREAD_TYPE DWORD WINAPI
- typedef DWORD (WINAPI *NATIVE_THREAD_PTR)(void *Data);
- typedef HANDLE THREAD_HANDLE;
- typedef CRITICAL_SECTION CRITSECT_HANDLE;
- #endif
- typedef void (*PTHREAD_PROC)(void *Data);
- #define THREAD_PROC(fn) void fn(void *Data)
- uint GetNumberOfCPU();
- uint GetNumberOfThreads();
- class ThreadPool
- {
- private:
- struct QueueEntry
- {
- PTHREAD_PROC Proc;
- void *Param;
- };
- void CreateThreads();
- static NATIVE_THREAD_TYPE PoolThread(void *Param);
- void PoolThreadLoop();
- bool GetQueuedTask(QueueEntry *Task);
-
- uint MaxAllowedThreads;
- THREAD_HANDLE ThreadHandles[MaxPoolThreads];
-
- uint ThreadsCreatedCount;
- uint ActiveThreads;
- QueueEntry TaskQueue[MaxPoolThreads];
- uint QueueTop;
- uint QueueBottom;
- bool Closing;
-
- #ifdef _WIN_ALL
-
- HANDLE QueuedTasksCnt;
-
- HANDLE NoneActive;
- #elif defined(_UNIX)
-
-
- uint QueuedTasksCnt;
- pthread_cond_t QueuedTasksCntCond;
- pthread_mutex_t QueuedTasksCntMutex;
- bool AnyActive;
- pthread_cond_t AnyActiveCond;
- pthread_mutex_t AnyActiveMutex;
- #endif
-
-
-
- CRITSECT_HANDLE CritSection;
- public:
- ThreadPool(uint MaxThreads);
- ~ThreadPool();
- void AddTask(PTHREAD_PROC Proc,void *Data);
- void WaitDone();
- #ifdef _WIN_ALL
- static int ThreadPriority;
- static void SetPriority(int Priority) {ThreadPriority=Priority;}
- #endif
- };
- #endif
- #endif
|