TD 多线程

1,封装pthread

thread.h

class Thread
{
public:
    Thread() : mRunning(false),mPriority(PRIORITY_NOT_SET) { }
    virtual ~Thread();
    bool start(char* name);
    bool join();
    pthread_t id();
    void yield();
    bool setPriority(int priority);
protected:
    static void* callback(void* arg);
    virtual void run() = 0;
private:
    pthread_t mThread;
    bool mRunning;
    int mPriority;
    static const int PRIORITY_NOT_SET = -1;
};

thread.cpp

#include "thread.h"

#define TAG "Thread"

void* Thread::callback(void* arg)
{
    Thread* thread = (Thread*) arg;
    thread->run();
    return NULL;
}

Thread::~Thread()
{
    if (mRunning)
    {
    }
}

bool Thread::start(char* name)
{
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    //int min_priority = sched_get_priority_min(SCHED_FIFO);
    //int max_priority = sched_get_priority_max(SCHED_FIFO);

    if(mPriority != PRIORITY_NOT_SET)
    {
        struct sched_param priority_holder;
        priority_holder.sched_priority = mPriority;
        pthread_attr_setschedparam(&attr, &priority_holder);
    }
    pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
    int ret = pthread_create((pthread_t*)&mThread, &attr, callback, this);
    pthread_setname_np(mThread,name);
    mRunning = (ret == 0);
    return mRunning;
}

bool Thread::join()
{
    if (!mRunning)
    {
        return false;
    }
    int ret = pthread_join(mThread, NULL);
    if (ret == 0)
    {
        mRunning = false;
        return true;
    }
    return false;
}

pthread_t Thread::id()
{
    return mThread;
}

void Thread::yield()
{
    sched_yield();
}

bool Thread::setPriority(int priority)
{
    int ret = 0;
    mPriority = priority;
    if(mRunning)
    {
        struct sched_param params;
        params.sched_priority = priority;
        ret = pthread_setschedparam(mThread, SCHED_FIFO, &params);
    }
    return ret == 0;
}

2,继承Thread,实现run函数

class MediaView: public Thread
{
public:
    MediaView(SelfQueue *queue);
    ~MediaView();

protected:
    void run();
』

3,之间在类中调用start

start("updatefilelist");

 

上一篇:青藤 #136 合并果子


下一篇:华为火墙没有各个区域都是默认拒绝的, 没有所谓的从高优先级到低优先级的默认放开的准则