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,避免可能的错误(如某些不检查链接完整性的功能开发)。