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