标准线程库std::thread封装——线程管理类

class ThreadHolder {
public:
    //
    ~ThreadHolder();
    //
    explicit ThreadHolder(const std::string& threadID, const Json::Value& param, std::function<void(const Json::Value&)> func, int interval = 1000);
    //
    ThreadHolder(const ThreadHolder&) = delete;
    //
    ThreadHolder& operator=(const ThreadHolder&) = delete;
    //
    void Start(int interval = 1000);
    //
    void Pause();
    //
    void Resume();
    //
    void Exit();
private:
    //
    bool GetFlag() const;
    //
    void SetFlag(bool flag);
    //
    void Excute();
    //
    bool Check() const;
private:
    const std::string m_strThreadID;
    bool m_bFlag;
    std::mutex m_mtxForFlag;
    std::mutex m_mtx;
    std::condition_variable m_cv;
    std::function<void(const Json::Value&)> m_func;
    Json::Value m_jsParam;
    bool m_bRun;
    bool m_bExit;
    int m_nInterval;
};
class ThreadManager
{
public:
    ThreadManager();
    ~ThreadManager();
    //
    bool CreateThread(const std::string& threadID, const Json::Value& param, std::function<void(const Json::Value&)> func, int interval);
    //
    void StartThread(const std::string& threadID, int interval);
    //
    void PauseThread(const std::string& threadID);
    //
    void ResumeThread(const std::string& threadID);
    //
    void ExitThread(const std::string& threadID);
private:
    std::map<std::string, std::shared_ptr<ThreadHolder>> m_mapThreads;

};

ThreadManager线程类对比std::thread:
优点:
1、无需管理Thread对象生命周期;
2、可以通过线程ID对线程进行开始、暂停、继续和停止操作。

缺点:
1、一个线程只能对应一个ID,若ID已存在,则不能创建新的线程;
2、只能创建固定格式(参数为Json对象,返回值为空)的线程,并将之放入线程循环体中执行。
若想让函数在线程中只执行一次,则推荐使用std::thread

使用:

class Test {
public:
    Test() : m_pThreadMng(std::make_unique<ThreadManager>()) {}
    ~Test() {
        m_pThreadMng->ExitThread("RunInThread");
    }

    void foo() {
        auto f = std::bind(&Test::RunInThread, this, std::placeholders::_1);
        m_pThreadMng->CreateThread("RunInThread", Json::objectValue, f);
        m_pThreadMng->StartThread("RunInThread");
    }

private:
    void RunInThread(const Json::Value&) {
        std::cout << "This is Test.";
    }

private:
    std::unique_ptr<ThreadManager> m_pThreadMng;
};

int main()
{
    Test obj;
    obj.foo();
    for (;;) {
        sleep(1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Sheleon1995/article/details/124846861
今日推荐