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;
}