Advertisement
Gistrec

Thread Pool Example

Apr 23rd, 2021
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. // https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h
  2.  
  3. #include <iostream>
  4. #include <thread>
  5. #include <vector>
  6. #include <functional>
  7. #include <condition_variable>
  8. #include <chrono>
  9. #include <mutex>
  10. #include <queue>
  11.  
  12.  
  13. class Executor
  14. {
  15. private:
  16.     enum class ExecutorStatus {
  17.         Work,
  18.         Shutdown,
  19.     };
  20.  
  21. public:
  22.     explicit Executor(size_t thread_count)
  23.         : thread_count_(thread_count)
  24.     {
  25.         workers_.reserve(thread_count);
  26.         for (auto i = 0; i < thread_count; ++i) {
  27.             workers_.emplace_back([this]{
  28.                 for (;;;) {
  29.                    
  30.                 }
  31.             })
  32.         }
  33.     }
  34.  
  35.     ~Executor() {
  36.         // TODO:
  37.     }
  38.  
  39.     void add_task(const std::function<void()> & function) {
  40.         if (status_ != ExecutorStatus::Work) {
  41.             return;
  42.         }
  43.  
  44.     }
  45.  
  46. private:
  47.     ExecutorStatus status_;
  48.  
  49.     std::mutex mutex_;
  50.     std::condition_variable condition_;
  51.  
  52.     std::queue< std::function<void()> > tasks;
  53.  
  54.     size_t thread_count_;
  55.     std::vector<std::thread> workers_;
  56. };
  57.  
  58. int main() {
  59.     Executor executor(5);
  60.  
  61.     executor.add_task([]() {
  62.         std::cout << "Start" << std::endl;
  63.         std::this_thread::sleep_for(std::chrono::seconds(1));
  64.         std::cout << "Finish" << std::endl;
  65.     });
  66.  
  67.     std::this_thread::sleep_for(std::chrono::seconds(3));
  68.  
  69.     executor.add_task([]() {
  70.         std::cout << "Start" << std::endl;
  71.         std::this_thread::sleep_for(std::chrono::seconds(1));
  72.         std::cout << "Finish" << std::endl;
  73.     });
  74.  
  75.     std::this_thread::sleep_for(std::chrono::seconds(10));
  76.  
  77.     std::cout << "Hello, World!" << std::endl;
  78.     return 0;
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement