zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    路由配置系统(views)
    Django-MTV简介
    web框架
    APScheduler
    python单例模式
    mysql_istall_db
    mysql多线程写入出现脏数据(重复数据)问题?
    南方周末 【1999年新年献词】总有一种力量让我们泪流满面
    卡特兰树通向证明
    可持久化线段树(主席树)快速简洁教程 图文并茂 保证学会。kth number例题
  • 原文地址:https://www.cnblogs.com/zhangdewang/p/8690693.html
Copyright © 2011-2022 走看看