linux c++自己使用pthread封装的线程类

#include<iostream>
#include<pthread.h>
#include<unistd.h>

using namespace std;

//typedef void *(*methodFunction)(void *);

class CThread
{
    public:
    CThread();
    ~CThread();
    void run();
    int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
    void wait();
    private:
    void *(*m_WorkFunction)(void *);
    void *m_args;
    pthread_t m_thread;
    int m_count;
    int m_state;
};

CThread::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0)
{    
}

CThread::~CThread()
{
    m_WorkFunction = NULL;
    m_args = NULL;
    m_state = 0;
}

void CThread::run()
{
    m_state = pthread_create(&m_thread, NULL, m_WorkFunction,m_args);
}

void CThread::wait()
{
    if( 0 == m_state)
    {
        pthread_join(m_thread, NULL);
    }
}

int CThread::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_WorkFunction = methodFunction;
    
    return 0;
}

void * thread_work(void*)
{
    for ( int i = 0; i < 20; i++)
    {
        cout << "the thread output the number:"<<i<< endl;
    }
}

int main(int argc, char * argv[])
{
    cout << "test for thread class" <<endl;
    CThread T;
    T.setWorkMethod(thread_work);
    T.run();
    T.wait();
    cout << "the process ending"<< endl;
    return 0;
}

 //demo2: 传入相应参数

#include<iostream>
#include<pthread.h>
#include<unistd.h>

using namespace std;

//typedef void *(*methodFunction)(void *);

class CThread
{
    public:
    CThread();
    ~CThread();
    void run();
    int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
    void wait();
    private:
    void *(*m_WorkFunction)(void *);
    void *m_args;
    pthread_t m_thread;
    int m_count;
    int m_state;
};

CThread::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0)
{    
}

CThread::~CThread()
{
    m_WorkFunction = NULL;
    m_args = NULL;
    m_state = 0;
}

void CThread::run()
{
    m_state = pthread_create(&m_thread, NULL, m_WorkFunction,m_args);
}

void CThread::wait()
{
    if( 0 == m_state)
    {
        pthread_join(m_thread, NULL);
    }
}

int CThread::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_WorkFunction = methodFunction;
    
    return 0;
}

void * thread_work(void* args)
{
    for ( int i = 0; i < 20; i++)
    {
        cout << "the thread output the number:"<<i<< (char*) args<<endl;
    }
}

int main(int argc, char * argv[])
{
    cout << "test for thread class" <<endl;
    CThread T;
    T.setWorkMethod(thread_work, (void *)"hellowrold");
    T.run();
    T.wait();
    cout << "the process ending"<< endl;
    return 0;
}

 //demo3:抛出发送信息

#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;
struct MSG
{
    MSG():
    _msg_count(0),
    _msg_str_message("")
    {}
    int _msg_count;
    std::string _msg_str_message;
};
//typedef void *(*methodFunction)(void *);

class CThread
{
public:
    CThread();
    ~CThread();
    void run();
    int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
    int setSleepTimeForSeconds(int sec);
    void sendMessage(void *(*dealMessageFunction)(MSG *), void* type = NULL);
    void stop();
    void wait();
private:
    static void * func_workFunction(void * args);
    void *(*m_WorkFunction)(void *);
    void *m_args;
    pthread_t m_thread;
    int m_count;
    int m_state;
    bool m_destroy;
    int m_sleepSeconds;
    MSG m_msg;
};

CThread::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0),
m_sleepSeconds(2),
m_destroy(false)
{    
    m_msg._msg_count = 1;
    m_msg._msg_str_message ="this is a message";
}

CThread::~CThread()
{
    m_WorkFunction = NULL;
    m_args = NULL;
    m_state = 0;
}

void CThread::run()
{
    m_state = pthread_create(&m_thread, NULL, func_workFunction, this);
}

void CThread::wait()
{
    if( 0 == m_state)
    {
        pthread_join(m_thread, NULL);
    }
}
void *  CThread::func_workFunction(void * args)
{
    CThread * ptrCThread = (CThread *)args;
    while(NULL == ptrCThread->m_WorkFunction && !ptrCThread->m_destroy)
    {
        cout << "the thread do nothing, sleep "<< ptrCThread->m_sleepSeconds<<" seconds" << endl;
        sleep(ptrCThread->m_sleepSeconds);
    }
    if(NULL != ptrCThread->m_WorkFunction && !ptrCThread->m_destroy)
    {
        //cout << "DEBUG:run the function "<< endl;
        ptrCThread->m_WorkFunction(ptrCThread->m_args);
        //cout << "DEBUG:end the function "<< endl;
    }
}

int CThread::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_WorkFunction = methodFunction;
    //cout << "DEBUG:set method "<< endl;
    return 0;
}
void CThread::sendMessage(void *(*dealMessageFunction)(MSG *), void* type)
{
    if(!m_msg._msg_str_message.empty())
    {
        if(NULL == type)
        {
            dealMessageFunction(&m_msg);
        }else
        {
            
        }
    }
}


int CThread::setSleepTimeForSeconds(int sec)
{
    if(sec > 0)
    {
        m_sleepSeconds = sec;
    }
}
void CThread::stop()
{
    m_destroy = true;
}

void * thread_work(void* args)
{
    for ( int i = 0; i < 20; i++)
    {
        cout << "the thread output the number: "<< i <<" "<< (char*) args<<endl;
    }
}

void * dealwithMessage(MSG * msg)
{
    MSG tmpMsg;
    tmpMsg._msg_count = msg->_msg_count;
    tmpMsg._msg_str_message = msg->_msg_str_message;
    
    cout << "[INFO]***get the message from the thread***:"<< tmpMsg._msg_str_message << endl;
}

void * tread_work1(void *args)
{
    for( int i = 0; i< 40; i++)
    {
        cout <<"another tread output: "<< i <<"  "<<(char*) args<< std::endl;
    }
}

int main(int argc, char * argv[])
{
    cout << "test for thread class" <<endl;
    CThread T;CThread T1;
    //T.setWorkMethod(thread_work, (void *)"hellowrold");
    T.run();
    T1.run();T1.setWorkMethod(tread_work1, (void*)"wssdsfsafa");
    T1.sendMessage(dealwithMessage);
    sleep(6);
    T.setWorkMethod(thread_work, (void *)"hellowrold");
    T.wait();
    T1.wait();
    cout << "the process ending"<< endl;
    return 0;
}

//demo4: 线程调用类方法执行

#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;
struct MSG
{
	MSG():
	_msg_count(0),
	_msg_str_message("")
	{}
	int _msg_count;
	std::string _msg_str_message;
};
//typedef void *(*methodFunction)(void *);
class CWork
{
public:
	CWork();
	~CWork();
	void init(void *);
};
class CThread
{
public:
	CThread();
	~CThread();
	void run();
	int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
	int setWorkMethod(CWork & t, void * args = NULL);
	// int setWorkMethod(const T *t, void * args = NULL);
	int setSleepTimeForSeconds(int sec);
	void sendMessage(void *(*dealMessageFunction)(MSG *), void* type = NULL);
	void stop();
	void wait();
private:
	static void * func_workFunction(void * args);
	void *(*m_WorkFunction)(void *);
	void *m_args;
	pthread_t m_thread;
	int m_count;
	int m_state;
	bool m_destroy;
	int m_sleepSeconds;
	CWork *ptrCWork;
	MSG m_msg;
};

CThread::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0),
m_sleepSeconds(2),
m_destroy(false),
ptrCWork(NULL)
{	
	m_msg._msg_count = 1;
	m_msg._msg_str_message ="this is a message";
}

CThread::~CThread()
{
	m_WorkFunction = NULL;
	m_args = NULL;
	m_state = 0;
}

void CThread::run()
{
	m_state = pthread_create(&m_thread, NULL, func_workFunction, this);
}

void CThread::wait()
{
	if( 0 == m_state)
	{
		pthread_join(m_thread, NULL);
	}
}
void *  CThread::func_workFunction(void * args)
{
	CThread * ptrCThread = (CThread *)args;
	while(NULL == ptrCThread->m_WorkFunction && !ptrCThread->m_destroy && ptrCThread->ptrCWork == NULL)
	{
		cout << "the thread do nothing, sleep "<< ptrCThread->m_sleepSeconds<<" seconds" << endl;
		sleep(ptrCThread->m_sleepSeconds);
	}
	if(NULL != ptrCThread->m_WorkFunction && !ptrCThread->m_destroy)
	{
		//cout << "DEBUG:run the function "<< endl;
		ptrCThread->m_WorkFunction(ptrCThread->m_args);
		//cout << "DEBUG:end the function "<< endl;
	}else if(NULL !=ptrCThread->ptrCWork && !ptrCThread->m_destroy)
	{
		ptrCThread->ptrCWork->init(ptrCThread->m_args);
	}
}

int CThread::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
	if(args != NULL)
	{
		m_args = args;
	}
	m_WorkFunction = methodFunction;
	//cout << "DEBUG:set method "<< endl;
	return 0;
}
int CThread::setWorkMethod( CWork &  t, void * args)
{
	if(args != NULL)
	{
		m_args = args;
	}
	ptrCWork = &t;
}
// int CThread::setWorkMethod(const  T *t, void * args)
// {
	// T * ptrClass = (T*)t;
	// ptrClass->init(args);
// }
void CThread::sendMessage(void *(*dealMessageFunction)(MSG *), void* type)
{
	if(!m_msg._msg_str_message.empty())
	{
		if(NULL == type)
		{
			dealMessageFunction(&m_msg);
		}else
		{
			
		}
	}
}


int CThread::setSleepTimeForSeconds(int sec)
{
	if(sec > 0)
	{
		m_sleepSeconds = sec;
	}
}
void CThread::stop()
{
	m_destroy = true;
}

void * thread_work(void* args)
{
	for ( int i = 0; i < 20; i++)
	{
		cout << "the thread output the number: "<< i <<" "<< (char*) args<<endl;
	}
}

void * dealwithMessage(MSG * msg)
{
	MSG tmpMsg;
	tmpMsg._msg_count = msg->_msg_count;
	tmpMsg._msg_str_message = msg->_msg_str_message;
	
	cout << "[INFO]***get the message from the thread***:"<< tmpMsg._msg_str_message << endl;
}

void * tread_work1(void *args)
{
	for( int i = 0; i< 40; i++)
	{
		cout <<"another tread output: "<< i <<"  "<<(char*) args<< std::endl;
	}
}

CWork::CWork(){}
CWork::~CWork(){}
void CWork::init(void * args)
{
	cout << "this is the class function result: "<< (char*)args <<endl;
}

int main(int argc, char * argv[])
{
	cout << "test for thread class" <<endl;
	CThread T;
	CWork work;
	//T.setWorkMethod(thread_work, (void *)"hellowrold");
	T.run();
	sleep(6);
	// T.setWorkMethod(thread_work, (void *)"hellowrold");
	T.setWorkMethod(work, (void *)"hellowrold");
	// T.setWorkMethod(&work, (void *)"hellowrold");
	T.wait();
	cout << "the process ending"<< endl;
	return 0;
}

 //demo4:使用类模板方式,线程调用类方法

#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;
struct MSG
{
    MSG():
    _msg_count(0),
    _msg_str_message("")
    {}
    int _msg_count;
    std::string _msg_str_message;
};
//typedef void *(*methodFunction)(void *);
template<typename T>
class CThread
{
public:
    CThread();
    ~CThread();
    void run();
    int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
    int setWorkMethod(T & t, void * args = NULL);
    int setSleepTimeForSeconds(int sec);
    void sendMessage(void *(*dealMessageFunction)(MSG *), void* type = NULL);
    void stop();
    void wait();
private:
    static void * func_workFunction(void * args);
    void *(*m_WorkFunction)(void *);
    void *m_args;
    pthread_t m_thread;
    int m_count;
    int m_state;
    bool m_destroy;
    int m_sleepSeconds;
    MSG m_msg;
    T * m_ptrClass;
};

template<typename T>
CThread<T>::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0),
m_sleepSeconds(2),
m_destroy(false),
m_ptrClass(NULL)
{    
    m_msg._msg_count = 1;
    m_msg._msg_str_message ="this is a message";
}

template<typename T>
CThread<T>::~CThread()
{
    m_WorkFunction = NULL;
    m_args = NULL;
    m_state = 0;
}

template<typename T>
void CThread<T>::run()
{
    m_state = pthread_create(&m_thread, NULL, func_workFunction, this);
}

template<typename T>
void CThread<T>::wait()
{
    if( 0 == m_state)
    {
        pthread_join(m_thread, NULL);
    }
}
template<typename T>
void *  CThread<T>::func_workFunction(void * args)
{
    CThread<T> * ptrCThread = (CThread<T> *)args;
    while(NULL == ptrCThread->m_WorkFunction && !ptrCThread->m_destroy && ptrCThread->m_ptrClass == NULL)
    {
        cout << "the thread do nothing, sleep "<< ptrCThread->m_sleepSeconds<<" seconds" << endl;
        sleep(ptrCThread->m_sleepSeconds);
    }
    if(NULL != ptrCThread->m_WorkFunction && !ptrCThread->m_destroy)
    {
        //cout << "DEBUG:run the function "<< endl;
        ptrCThread->m_WorkFunction(ptrCThread->m_args);
        //cout << "DEBUG:end the function "<< endl;
    }else if(NULL !=ptrCThread->m_ptrClass && !ptrCThread->m_destroy)
    {
        ptrCThread->m_ptrClass->init(ptrCThread->m_args);
    }
}

template<typename T>
int CThread<T>::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_WorkFunction = methodFunction;
    //cout << "DEBUG:set method "<< endl;
    return 0;
}
template<typename T>
int CThread<T>::setWorkMethod( T & t, void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_ptrClass = &t;
}
template<typename T>
void CThread<T>::sendMessage(void *(*dealMessageFunction)(MSG *), void* type)
{
    if(!m_msg._msg_str_message.empty())
    {
        if(NULL == type)
        {
            dealMessageFunction(&m_msg);
        }else
        {
            
        }
    }
}

template<typename T>
int CThread<T>::setSleepTimeForSeconds(int sec)
{
    if(sec > 0)
    {
        m_sleepSeconds = sec;
    }
}

template<typename T>
void CThread<T>::stop()
{
    m_destroy = true;
}

void * thread_work(void* args)
{
    for ( int i = 0; i < 20; i++)
    {
        cout << "the thread output the number: "<< i <<" "<< (char*) args<<endl;
    }
}

void * dealwithMessage(MSG * msg)
{
    MSG tmpMsg;
    tmpMsg._msg_count = msg->_msg_count;
    tmpMsg._msg_str_message = msg->_msg_str_message;
    
    cout << "[INFO]***get the message from the thread***:"<< tmpMsg._msg_str_message << endl;
}

void * tread_work1(void *args)
{
    for( int i = 0; i< 40; i++)
    {
        cout <<"another tread output: "<< i <<"  "<<(char*) args<< std::endl;
    }
}

class CWork
{
public:
    CWork();
    ~CWork();
    void init(void *);
};
CWork::CWork(){}
CWork::~CWork(){}
void CWork::init(void * args)
{
    cout << "this is the class function "<< (char*)args <<endl;
}

int main(int argc, char * argv[])
{
    cout << "test for thread class" <<endl;
    CThread<CWork> T;
    CWork work;
    //T.setWorkMethod(thread_work, (void *)"hellowrold");
    T.run();
    sleep(6);
    //T.setWorkMethod(thread_work, (void *)"hellowrold");
    T.setWorkMethod(work, (void *)"hellowrold");
    // T.setWorkMethod(&work, (void *)"hellowrold");
    T.wait();
    cout << "the process ending"<< endl;
    return 0;
}

 // worker is changed

#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

#define FREE 0
#define BUSY 1
using namespace std;
struct MSG
{
    MSG():
    _msg_count(0),
    _msg_str_message("")
    {}
    int _msg_count;
    std::string _msg_str_message;
};
//typedef void *(*methodFunction)(void *);
template<typename T>
class CThread
{
public:
    CThread();
    ~CThread();
    void run();
    int setWorkMethod(void *(*methodFunction)(void *), void * args = NULL);
    int setWorkMethod(T & t, void * args = NULL);
    int setSleepTimeForSeconds(int sec);
    void sendMessage(void *(*dealMessageFunction)(MSG *), void* type = NULL);
    void stop();
    void wait();
private:
    static void * func_workFunction(void * args);
    void *(*m_WorkFunction)(void *);
    void *m_args;
    pthread_t m_thread;
    int m_count;
    int m_state;
    bool m_destroy;
    int m_sleepSeconds;
    MSG m_msg;
    T * m_ptrClass;
};

template<typename T>
CThread<T>::CThread():
m_WorkFunction(NULL),
m_args(NULL),
m_state(0),
m_count(0),
m_sleepSeconds(2),
m_destroy(false),
m_ptrClass(NULL)
{
    m_msg._msg_count = 1;
    m_msg._msg_str_message ="this is a message";
}

template<typename T>
CThread<T>::~CThread()
{
    m_WorkFunction = NULL;
    m_args = NULL;
    m_state = 0;
}

template<typename T>
void CThread<T>::run()
{
    m_state = pthread_create(&m_thread, NULL, func_workFunction, this);
}

template<typename T>
void CThread<T>::wait()
{
    if( 0 == m_state)
    {
        pthread_join(m_thread, NULL);
    }
}
template<typename T>
void *  CThread<T>::func_workFunction(void * args)
{
    CThread<T> * ptrCThread = (CThread<T> *)args;
    while(NULL == ptrCThread->m_WorkFunction && !ptrCThread->m_destroy && ptrCThread->m_ptrClass == NULL)
    {
        cout << "the thread do nothing, sleep "<< ptrCThread->m_sleepSeconds<<" seconds" << endl;
        sleep(ptrCThread->m_sleepSeconds);
    }
    if(NULL != ptrCThread->m_WorkFunction && !ptrCThread->m_destroy)
    {
        //cout << "DEBUG:run the function "<< endl;
        ptrCThread->m_WorkFunction(ptrCThread->m_args);
        //cout << "DEBUG:end the function "<< endl;
    }else if(NULL !=ptrCThread->m_ptrClass && !ptrCThread->m_destroy)
    {
        ptrCThread->m_ptrClass->init(ptrCThread->m_args);
    }
}

template<typename T>
int CThread<T>::setWorkMethod(void *(*methodFunction)(void *), void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_WorkFunction = methodFunction;
    //cout << "DEBUG:set method "<< endl;
    return 0;
}
template<typename T>
int CThread<T>::setWorkMethod( T & t, void * args)
{
    if(args != NULL)
    {
        m_args = args;
    }
    m_ptrClass = &t;
}
template<typename T>
void CThread<T>::sendMessage(void *(*dealMessageFunction)(MSG *), void* type)
{
    if(!m_msg._msg_str_message.empty())
    {
        if(NULL == type)
        {
            dealMessageFunction(&m_msg);
        }else
        {

        }
    }
}

template<typename T>
int CThread<T>::setSleepTimeForSeconds(int sec)
{
    if(sec > 0)
    {
        m_sleepSeconds = sec;
    }
}

template<typename T>
void CThread<T>::stop()
{
    m_destroy = true;
}

void * thread_work(void* args)
{
    for ( int i = 0; i < 20; i++)
    {
        cout << "the thread output the number: "<< i <<" "<< (char*) args<<endl;
    }
}

void * dealwithMessage(MSG * msg)
{
    MSG tmpMsg;
    tmpMsg._msg_count = msg->_msg_count;
    tmpMsg._msg_str_message = msg->_msg_str_message;

    cout << "[INFO]***get the message from the thread***:"<< tmpMsg._msg_str_message << endl;
}

void * tread_work1(void *args)
{
    for( int i = 0; i< 40; i++)
    {
        cout <<"another tread output: "<< i <<"  "<<(char*) args<< std::endl;
    }
}

class CWork
{
public:
    CWork();
    ~CWork();
    void init(void *);
    void start(char * args = NULL);
private:
    int m_state;
    string m_strMsg;
};
CWork::CWork():m_state(FREE){}
CWork::~CWork(){}
void CWork::init(void * args)
{
    while(m_state == FREE)
    {
        cout << "this is the class work function "<< (char*)args <<endl;
        sleep(1);
        cout << "wait msg"<<endl;
    }
    while(m_state == BUSY)
    {
        cout << "the work start wokrking, the work message is :"<< m_strMsg<<endl;
        sleep(1);

    }
    /*
    for( int i = 0; i < 100 ; i++)
    {
        cout << "the work start wokrking, the work message is :"<< m_strMsg<<endl;
    }
    */

}
void CWork::start(char * args)
{
    if( NULL == args)
    {
        std::cout <<"the start args is none, so nothing to do "<< std::endl;
    }else
    {
        m_strMsg = args;
        m_state = BUSY;
    }
}
int main(int argc, char * argv[])
{
    cout << "test for thread class" <<endl;
    CThread<CWork> T;
    CWork work;
    T.run();
     for(int i =0;i <10; i++)
    {
     std::cout << "main thread message:first -----" <<i <<std::endl;
    }

    sleep(6);
    cout<<"********set the thread worker"<<endl;
    T.setWorkMethod(work, (void *)"hellowrold");
    for(int i =0;i <10; i++)
    {
     std::cout << "main thread message:second -----" <<i <<std::endl;
    }
    string strinput;
    while(cin>>strinput)
    {
        cout << strinput << endl;
        if(strinput.compare("q") == 0)
            break;
    }
    cout<<"********set the  worker start state"<<endl;
    work.start("we have a good way to work");
    strinput.clear();
    while(cin>>strinput)
    {
        cout << strinput << endl;
        if(strinput.compare("q") == 0)
            break;
    }
    for(int i =0;i <100; i++)
    {
     std::cout << "main thread message:" <<i <<std::endl;
    }
   // sleep(6);
    //T.stop();
    T.wait();
    cout << "the process ending"<< endl;
    return 0;
}
原文地址:https://www.cnblogs.com/zhangdewang/p/8690693.html