用虚函数或者bind、function实现线程的方法

应用:Thread封装

在实现自定义的线程类时,曾经这么干过:定义虚函数run(),用户自定义的CustomThread::Thread后,自己实现run()函数就OK了。 当时觉得这么做也不错。
现在有了boost::function/boost::bind我们可以这么干:
定义一个线程类:
.h文件
01    #include <pthread.h>
02    #include <string>
03    #include <boost/function.hpp>
04    #include <boost/bind.hpp>
05    
06    using namespace std;
07    class Thread
08    {
09        typedef boost::function<void()> ThreadFun;
10        public:
11            Thread(const ThreadFun& threadFun,const string& threadName = string());
12            pid_t     getThreadId();
13            string    getThreadName();
14            int       start();
15         
16        private:
17            static void* startThread(void* thread);
18       
19        private:
20            pthread_t   m_thread; //线程句柄
21            pid_t       m_tid;    //线程ID
22            string      m_strThreadName;    //线程名称
23            bool        m_bStarted;         //线程是否启动
24            ThreadFun   m_func;             //线程处理函数
25    };

.cpp文件
01    #include "thread.h"
02    
03    Thread::Thread(const Thread::ThreadFun& threadFun, const string& threadName):
04    m_func(threadFun), m_strThreadName(threadName)
05    {
06    }
07    
08    int Thread::start()
09    {
10        m_tid = pthread_create(&m_thread, NULL, &startThread, this);
11        return 0;
12    }
13    
14    void* Thread::startThread(void* obj)
15    {
16      Thread* thread = static_cast<Thread*>(obj);
17      thread->m_func();
18      return NULL;
19    }
20    
21    pid_t Thread::getThreadId()
22    {
23        return m_tid;
24    };
25    
26    string  Thread::getThreadName()
27    {
28        return m_strThreadName;
29    }

测试程序
view source
print?
01    void ThreadProcess()
02    {
03        int count = 100;
04        for (int i = 0; i < count; i++)
05        {
06            if (i % 10 == 0)   
07            cout<<"\n";
08            cout<<i<<"\t";
09        }
10    }
11    
12    int main()
13    {
14        boost::function<void()> f;
15        f = boost::bind(&ThreadProcess);   
16            Thread thread(f, "ThreadTest");
17            thread.start();
18        sleep(1000*1000);
19        return 0;

20    }




虚函数实现:

类的定义如下:

.h文件内容如下

01#pragma once
02#include <windows.h>
03/****************************************************************
04* 文件名:Thread.h
05* 功能:线程类定义,提供线程基类
06* 作者:
07* 时间:2012-2-18
08*****************************************************************/
09class Thread
10{
11    public:
12        Thread(void);
13        ~Thread(void);
14 
15        void start();           //线程启动     
16        void stop();            //线程关闭
17 
18    protected:
19        virtual void* run() = 0;        //线程运行
20        friend unsigned long _stdcall  _thd_start(void*param); //友元函数
21 
22    private:
23        HANDLE _thread;         //线程句柄
24        bool m_bStop;           //线程是否需要停止
25        unsigned long m_threadId;   //线程ID
26 
27                 
28};

.cpp文件格式如下

01#include "StdAfx.h"
02#include "Thread.h"
03 
04 
05/*
06 *函数名:_thd_start
07 *功能:线程入口函数
08 *参数:param Thread的this指针
09 */
10unsigned long _stdcall _thd_start(void* param)  //线程函数的定义有固定的规则
11{
12    return (long)((Thread*)param)->run();
13}
14 
15 
16Thread::Thread(void)
17{
18        m_bStop = false;
19        m_threadId = 0;
20}
21 
22 
23Thread::~Thread(void)
24{
25        stop();
26}
27 
28void Thread::start()
29{
30    _thread = ::CreateThread(NULL, 0, _thd_start, this, 0, &m_threadId);    //线程创建后立即运行
31}
32 
33 
34void Thread::stop()
35{
36    ::CloseHandle(_thread);
37}

使用方法如下:

01#include "stdafx.h"
02#include "Thread.h"
03#include <iostream>
04 
05using namespace std;
06 
07class TestCustomThread : public Thread
08{
09        protected:
10            void* run();
11};
12 
13void* TestCustomThread::run()
14{
15        for (int i = 0; i < 500; i++)
16        {
17            ::Sleep(200);
18            cout<<i<<"  "<<endl<<flush;
19        }
20 
21        return NULL;
22}
23 
24int _tmain(int argc, _TCHAR* argv[])
25{
26        TestCustomThread customThread;
27 
28        customThread.start();
29 
30         
31        getchar();
32        return 0;
33}

如果我们想要定义自己的线程类,继承Thread类即可,并重写run()函数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值