博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程基类的构建与代码实践
阅读量:6868 次
发布时间:2019-06-26

本文共 2171 字,大约阅读时间需要 7 分钟。

  1. 在C++中常用到线程来执行相应的任务,一般会构建一个线程基类,其他的线程类型通过继承的方式来实现不同的功能。
  2. 所实现的代码考虑了windows和linux平台的兼容性,且具有代表性,在工程实践中具有参考价值。
  3. 在创建线程时,对线程的属性进行了设置,如堆栈大小,以及设置线程为分离状态,从而可以在线程结束时可自动释放资源。
  4. 提供一个整体性的线程框架,继承该基类的线程只要实现相应的work函数即可处理相应的任务。
class ThreadBase{protected:    #ifdef LINUX    pthread_t thread_id;#endif#ifdef WIN32    HANDLE thread_id;#endif    public:    bool run_flag;    bool is_end;    public:    ThreadBase();    ~ThreadBase();    int start();    void stop();    bool isEnd();    virture int process(); //子类来重写#ifdef LINUX    static void* run(void* arg);#endif#ifdef WIN32    static void run(void* arg);#endif}void stop(){    run_flag = false;}bool isEnd(){    return is_end;}int start(){    if (run_flag)    {        return 0;    }    #ifdef LINUX    pthread_attr_t thread_attr;    pthread_attr_init(&thread_attr);    pthread_attr_setstacksize(&thread_attr, 1024 * 10); //设置线程的堆栈大小    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);    //设置线程为分离状态,即当线程结束时会自动释放资源。若是未分离状态,需要在主线程中调用join来释放。    int ret = pthread_create(&thread_id, &thread_attr, ThreadBase::run, (void*)this);    if (ret != 0)    {        printf("create failed, errno[%d],desc[%s]", errno, strerror(errno));        pthread_attr_destroy(&thread_attr);        return -1;    }    else    {        pthread_attr_destroy(&thread_attr);        return 0;    }#endif        #ifdef WIN32    thread_id = (HANDLE)_beginthread(ThreadBase::run, 0, (void*)this);    if (thread_id == 0)    {        return -1;    }    else    {        return 0;    }#endif        }int process(){    while(run_flag)    {        work();    }}#ifdef LINUXvoid* ThreadBase::run(void* arg){    CThreadBase * pThread = (CThreadBase * )arg;    pThread->run_flag = true;    pThread->is_end = false;    pThread->process();    pThread->is_end = true;    return NULL;}#endif#ifdef WIN32void ThreadBase::run(void* arg){    ThreadBase * pThread = (ThreadBase * )arg;    pThread->run_flag = true;    pThread->is_end = false;    pThread->process();    pThread->is_end = true;    return;}#endifThreadBase::~ThreadBase(){    stop();}ThreadBase::ThreadBase(){    run_flag = false;    is_end = true;}

 

转载于:https://www.cnblogs.com/share-ideas/p/10886180.html

你可能感兴趣的文章
NumPy之array
查看>>
ado 设置过滤
查看>>
微软私有云POC部署文档
查看>>
云计算
查看>>
mysql中的主从复制slave-skip-errors参数使用方法
查看>>
永久关闭wps热点新闻的办法
查看>>
飞信机器人安装
查看>>
修改一个字段中的部分内容
查看>>
kubernetes-1.11.0集群部署之master集群 (二)
查看>>
POJ_2001_Shortest Prefixes
查看>>
Webpack 的 HtmlWebpackPlugin 如何控制某个 chunks 的 inject 位置?
查看>>
Silverlight C# 游戏开发:未写代码先设计
查看>>
return false
查看>>
BZOJ3769:BST again(记忆化搜索DP)
查看>>
第二章:演化架构师
查看>>
20165315 第八周考试课下补做
查看>>
学习CAS实现SSO单点登录
查看>>
同步异步的知识补充
查看>>
css关于定位那些事情
查看>>
WCF IIS上部署服务
查看>>