Gistrec icon

Thread Pool Example

Gistrec | PRO | 04/23/21 12:41:02 PM UTC | 0 ⭐ | 1127 👁️ | Never ⏰ | []
C++ |

1.47 KB

|

None

|

0 👍

/

0 👎

// https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h
 
#include <iostream>
#include <thread>
#include <vector>
#include <functional>
#include <condition_variable>
#include <chrono>
#include <mutex>
#include <queue>
 
 
class Executor
{
private:
    enum class ExecutorStatus {
        Work,
        Shutdown,
    };
 
public:
    explicit Executor(size_t thread_count)
        : thread_count_(thread_count)
    {
        workers_.reserve(thread_count);
        for (auto i = 0; i < thread_count; ++i) {
            workers_.emplace_back([this]{
                for (;;;) {
                    
                }
            })
        }
    }
 
    ~Executor() {
        // TODO:
    }
 
    void add_task(const std::function<void()> & function) {
        if (status_ != ExecutorStatus::Work) {
            return;
        }
 
    }
 
private:
    ExecutorStatus status_;
 
    std::mutex mutex_;
    std::condition_variable condition_;
 
    std::queue< std::function<void()> > tasks;
 
    size_t thread_count_;
    std::vector<std::thread> workers_;
};
 
int main() {
    Executor executor(5);
 
    executor.add_task([]() {
        std::cout << "Start" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "Finish" << std::endl;
    });
 
    std::this_thread::sleep_for(std::chrono::seconds(3));
 
    executor.add_task([]() {
        std::cout << "Start" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "Finish" << std::endl;
    });
 
    std::this_thread::sleep_for(std::chrono::seconds(10));
 
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎