ThreadPool.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #pragma once
  2. #include "../Common.h"
  3. #include "CritSect.h"
  4. #include "Deque.h"
  5. NS_BF_BEGIN
  6. class ThreadPool
  7. {
  8. public:
  9. class Job;
  10. class Thread
  11. {
  12. public:
  13. ThreadPool* mThreadPool;
  14. BfpThread* mBfpThread;
  15. BfpThreadId mCurJobThreadId;
  16. Job* mActiveJob;
  17. public:
  18. Thread();
  19. ~Thread();
  20. void Proc();
  21. };
  22. class Job
  23. {
  24. public:
  25. BfpThreadId mFromThreadId;
  26. bool mProcessing;
  27. Job()
  28. {
  29. mFromThreadId = 0;
  30. mProcessing = false;
  31. }
  32. // By default don't allow cancelling
  33. virtual bool Cancel()
  34. {
  35. return false;
  36. }
  37. virtual ~Job()
  38. {
  39. }
  40. virtual void Perform() = 0;
  41. };
  42. class ProcJob : public Job
  43. {
  44. public:
  45. BfpThreadStartProc mProc;
  46. void* mParam;
  47. ProcJob()
  48. {
  49. mProc = NULL;
  50. mParam = NULL;
  51. }
  52. void Perform() override
  53. {
  54. mProc(mParam);
  55. }
  56. };
  57. public:
  58. int mStackSize;
  59. int mMaxThreads;
  60. CritSect mCritSect;
  61. SyncEvent mEvent;
  62. Deque<Job*> mJobs;
  63. Array<Thread*> mThreads;
  64. int mFreeThreads;
  65. int mRunningThreads;
  66. bool mShuttingDown;
  67. public:
  68. ThreadPool(int maxThreads = 4, int stackSize = 1024 * 1024);
  69. ~ThreadPool();
  70. void Shutdown();
  71. void SetStackSize(int stackSize);
  72. void AddJob(Job* job, int maxWorkersPerProviderThread = 0x7FFFFFFF);
  73. void AddJob(BfpThreadStartProc proc, void* param, int maxWorkersPerProviderThread = 0x7FFFFFFF);
  74. bool IsInJob();
  75. void CancelAll();
  76. };
  77. NS_BF_END