linux 多线程类

来源:互联网 发布:windows更新过程中关闭 编辑:程序博客网 时间:2024/05/29 08:02
#ifndef THREAD_H
#define THREAD_H


#include <sys/types.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

class Thread
{
public:
    Thread();
    virtual ~Thread();
public:
    int start();
    int join(void **ptr = NULL);
    int detach();
    void pause();
    void continues();
    pthread_t getpid();

protected:
    virtual void run() = 0;

private:
    void maskSIGUSR1();
    static void *process(void *data);

private:
    pthread_t m_pid;

    //信号
    sigset_t m_wait_signal;
};

#endif // THREAD_H

////////////////////////////////////////////////////////////////////////////////

#include "thread.h"

Thread::Thread()
{
    m_pid = 0;
    maskSIGUSR1();

    // 定义SIGUSR1信号阻塞
    sigemptyset(&m_wait_signal);
    sigaddset(&m_wait_signal, SIGUSR1);
}

Thread::~Thread()
{
    m_pid = 0;
}

int Thread::start()
{
    int nRet = pthread_create(&m_pid, NULL, process, (void*)this);
    if (nRet < 0)
    {
        perror("create thread");
        return -1;
    }

    return 0;
}

int Thread::join(void **ptr)
{
    int nRet = pthread_join(m_pid, ptr);
    if (nRet < 0)
    {
        perror("pthread_join");
        return -1;
    }

    return 0;
}

int Thread::detach()
{
    int nRet = pthread_detach(m_pid);
    if (nRet < 0)
    {
        perror("pthread_detach");
        return -1;
    }

    return 0;
}

void Thread::pause()
{
    int sig;
    sigwait(&m_wait_signal , &sig);
}

void Thread::continues()
{
    pthread_kill(m_pid , SIGUSR1);
}

pthread_t Thread::getpid()
{
    return m_pid;
}

void Thread::maskSIGUSR1()
{
    sigset_t sig;
    sigemptyset(&sig);
    sigaddset(&sig , SIGUSR1);
    pthread_sigmask(SIG_BLOCK , &sig , NULL);
}



void *Thread::process(void *data)
{
    Thread *pThread = (Thread*)data;
    pThread->run();
}


0 0
原创粉丝点击