Program Listing for File scheduler.h#

Return to documentation for file (scheduler\scheduler.h)

#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include <thread>
#include <mutex>
#include <queue>
#include <deque>
#include <functional>
#include <memory>
#include <condition_variable>
#include <cstdint>
#include <list>
#include "../flags.h"

class CTaskScheduler
{
public:
    CTaskScheduler(size_t nMinIdle = 4, size_t nMaxBusy = 32);

    ~CTaskScheduler();

    enum class EScheduleFlags
    {
        normal = 0x0,
        priority = 0x1,
        no_queue = 0x2,
    };

    bool Schedule(std::function<void()> fnTask, hlpr::flags<EScheduleFlags> flags = EScheduleFlags::normal);

    void WaitForExecution();

    size_t GetThreadCount() const;

    size_t GetMaxThreadCount() const;

    size_t GetBusyThreadCount() const;

    size_t GetIdleThreadCount() const;

private:
    struct CThread
    {
    public:
        CThread();

        ~CThread();

        void Execute(std::function<void()> fnTask);

    private:
        void ThreadFunc();

        std::thread             m_thread;
        bool                    m_bShutdown = false;
        bool                    m_bStarted = false;
        std::function<void()>   m_fnTask;
        std::mutex              m_mtxSyncStart;
        std::condition_variable m_cvStarted;
        std::mutex              m_mtxSyncExecute;
        std::condition_variable m_cvExecute;
    };

    void Execute(std::list<std::shared_ptr<CThread>>::iterator itThread, std::function<void()> fnTask);

    size_t                                  m_nMinIdle = 4;
    size_t                                  m_nMaxBusy = 32;
    size_t                                  m_nMaxThreads = 0;
    mutable std::mutex                      m_mtxQueueAccess;
    std::queue<std::list<std::shared_ptr<CThread>>::iterator> m_queueIdleThreads;
    std::list<std::shared_ptr<CThread>>     m_lstThreads;
    std::deque<std::function<void()>>       m_dequeTasks;
};

#endif // !defined THREAD_POOL_H