linux std cpp thread 后台延时执行后自清理例子
分享一个纯C++11实现的多线程延时执行,并自清理功能。简单使用,但可能有问题,需慎用。
#include <string> #include <iostream> #include <map> #include <vector> #include <list> #include <set> #include <mutex> #include <thread> #include <chrono> typedef int (*DelayCallback)(void* param); //回调函数定义 static std::map<std::thread::id,std::thread*> zsdStartedThread; //记录已启动的线程 //TODO: 线程不安全 void _DelayClean(std::thread::id& thid){ if(zsdStartedThread.find(thid) != zsdStartedThread.end()){ std::cerr << "### thread will destory success = " << thid << std::endl; delete zsdStartedThread[thid]; zsdStartedThread.erase(thid); }else{ std::cerr << "### error clear thread failed threadid = " << thid << std::endl; } } void _DelayMain(int delay,DelayCallback callback,void* param){ std::this_thread::sleep_for(std::chrono::milliseconds(delay)); callback(param); std::thread::id thid = std::this_thread::get_id(); std::cerr << "### thread will destory = " << thid << std::endl; _DelayClean(thid); } /// /// \brief 入口 /// \param delay 延时多久-毫米 /// \param callback 回调函数-在另一个线程执行 /// \param param 回调函数参数-需要自行保证线程安全 /// \return 0 成功 其他失败 /// int StartDelayThread(int delay,DelayCallback callback,void* param){ if(callback == 0 || delay <= 0) return -1; //startedThread std::thread* th = new std::thread(&_DelayMain, delay,callback,param ); zsdStartedThread[th->get_id()] = th ; th->detach(); return 0; } int GetDelayThreadCount(void){ return zsdStartedThread.size(); }
注意:Linux std::thread 内部实现是pthread,链接时需要连接pthread,避免可能的错误(如某些不检查链接完整性的功能开发)。