C++ pthread封装

#ifndef __HI_MW_THREAD_H__
#define __HI_MW_THREAD_H__

#include <pthread.h>
#include <unistd.h>
#include "hi_type.h"

/*
 * HiMWThread Event callback. Used for listen running state.
 */
class HiMWThread;
class IHiMWThreadEvt
{
public:
    virtual void onHiMWThreadExit(HiMWThread* pHiMWThread) = 0;
    virtual ~IHiMWThreadEvt(){}
};

/*
 * Base HiMWThread class.  The implementation is system-dependent.
 */
class HiMWThread
{
public:
    typedef void (*HiMWThreadFunc)(const void* arg);

    typedef struct {
        volatile bool wait;   /* enable or disable HiMWThread */
        volatile bool once;   /* select loop once or always */
        volatile bool exit;   /* exit and recovery resource */
    } HiMWThreadStat;

    typedef enum {
        ONCE   = 0x1 << 0,  /* just loop once */
        REPEAT = 0x1 << 1,  /* repeat loop  */
        WAIT   = 0x1 << 2,  /* wait for resume,only valid at first running */
    } HiMWThreadFlag;
public:
    HiMWThread(HiMWThreadFunc func = NULL, const void* arg = NULL, IHiMWThreadEvt* pEvt = NULL);
    virtual ~HiMWThread();

    void run(unsigned int flag = ONCE);
    void suspend();
    void resume();
    void exit();/* quit immediately */
    void exitAndJoin();

protected:
    virtual void run(const void* arg){HI_UNUSED(arg);};
private:
    static void* loop(void* arg);
    void task();
private:
    HiMWThreadFunc  mThreadFunc;
    const void*     mArg;
    IHiMWThreadEvt* mEvt;
    pthread_t       mId;
    HiMWThreadStat  mStat;
    pthread_mutex_t mLock;
    pthread_cond_t  mCond;
};
#endif /*__HI_MW_THREAD_H__*/


#define LOG_NDEBUG 0
#define LOG_TAG "HiMW@Hi_mw_thread.cpp"

#include "hi_mw_thread.h"
#include "hi_mw_log.h"
#include "hi_mw_common.h"

HiMWThread::HiMWThread(HiMWThreadFunc func, const void* arg, IHiMWThreadEvt* pEvt)
    : mThreadFunc(func), mArg(arg), mEvt(pEvt), mId(0)
{
    mStat.wait = false;
    mStat.once = false;
    mStat.exit = true;
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_init(&mLock, NULL);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);

    s32Ret = pthread_cond_init(&mCond, NULL);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);
}

HiMWThread::~HiMWThread()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
        s32Ret = pthread_mutex_unlock(&mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);
  
        s32Ret = pthread_join(mId, NULL);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);
    }
    else
    {
        s32Ret = pthread_mutex_unlock(&mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);
    }

    s32Ret = pthread_mutex_destroy(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);

    s32Ret = pthread_cond_destroy(&mCond);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_init fail, ret:0x%x", s32Ret);
}

void HiMWThread::exit()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
        mStat.exit = true;
        mStat.wait = false;
        s32Ret = pthread_cond_signal(&mCond);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_signal fail, ret:0x%x", s32Ret);
    }
    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
    //if (mEvt) mEvt->onHiMWThreadExit(this);
}

void HiMWThread::exitAndJoin()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
       mStat.exit = true;
       mStat.wait = false;

       s32Ret = pthread_cond_signal(&mCond);
       RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_signal fail, ret:0x%x", s32Ret);

       s32Ret = pthread_mutex_unlock(&mLock);
       RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);

       s32Ret = pthread_join(mId, NULL);
       RET_CHECK_ERR_LOG(s32Ret, "pthread_join fail, ret:0x%x", s32Ret);
       return;
    }

    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);

    LOGW("Thread not run");
}

void HiMWThread::run(unsigned int flag)
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
        mStat.exit = true;
        mStat.wait = false;

        s32Ret = pthread_cond_signal(&mCond);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_signal fail, ret:0x%x", s32Ret);

        s32Ret = pthread_mutex_unlock(&mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);

        s32Ret = pthread_join(mId, NULL);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_join fail, ret:0x%x", s32Ret);

        s32Ret = pthread_mutex_lock(&mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);
    }

    mStat.exit = false;
    mStat.wait = true;
    mStat.once = flag & ONCE;

    if (~flag & WAIT)
    {
        mStat.wait = false;
    }
    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);

    s32Ret = pthread_create(&mId, NULL, loop, this);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_create fail, ret:0x%x", s32Ret);
}

void HiMWThread::suspend()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
        if (mStat.wait)
        {
            s32Ret = pthread_mutex_unlock(&mLock);
            RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
            return;
        }

        mStat.wait = true;
    }
    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
}

void HiMWThread::resume()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    if (!mStat.exit)
    {
        if (!mStat.wait)
        {
            s32Ret = pthread_mutex_unlock(&mLock);
            RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
            return;
        }

        mStat.wait = false;
        s32Ret = pthread_cond_signal(&mCond);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_signal fail, ret:0x%x", s32Ret);
    }
    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
}

void* HiMWThread::loop(void* arg)
{
    HiMWThread* ptr = reinterpret_cast<HiMWThread*>(arg);

    while (!ptr->mStat.exit)
    {
        ptr->task();
    }

    if (ptr->mEvt)
    {
        ptr->mEvt->onHiMWThreadExit(ptr);
    }

    return NULL;
}

void HiMWThread::task()
{
    HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = pthread_mutex_lock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_lock fail, ret:0x%x", s32Ret);

    while (mStat.wait)
    {
        s32Ret = pthread_cond_wait(&mCond, &mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_cond_wait fail, ret:0x%x", s32Ret);
    }

    if (mStat.exit)
    {
        s32Ret = pthread_mutex_unlock(&mLock);
        RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);
        return;
    }

    mStat.wait = mStat.once;
    s32Ret = pthread_mutex_unlock(&mLock);
    RET_CHECK_ERR_LOG(s32Ret, "pthread_mutex_unlock fail, ret:0x%x", s32Ret);

    if (!mThreadFunc)
    {
        return run(mArg);
    }

    return mThreadFunc(mArg);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坂田民工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值