青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

stlf

uti.thread

                                                                    UTI.THREAD

    我寫的線程類, 用GP技術(shù)和OOP思想對OS的線程創(chuàng)建進行了封裝, 使用起來靈活方便(后附example),力求簡單實用。

    這個線程類需要boost庫的頭文件支持, 但無需對boost庫進行編譯, 要知道編譯boost庫是一個漫長的過程... 而且boost庫里面有很多我們平常用不上的一些“高級”玩意:-).


    此外, 我還寫了一系列使用靈活、方便,且在編程中經(jīng)常需要使用的類(如同步鎖, 線程池, 同步隊列, 常用I/O對象, 常用算法等), 我其中的大部分放入了uti namespace之中, 所以稱之為uti庫。我盡量保持這些類的相對獨立,一般只需要注釋掉某行就可以單獨使用??傊?, 我寫此類庫所奉行的原則是 --- 穩(wěn)定,靈活,簡單(在example中應該可以看得到:-)).其他類庫將出現(xiàn)在后續(xù)文章中, 希望大家喜歡, 也希望能和大家交流:-) stlflingfeitang@gmail.com


/*******************************************************************

created:   2008/06/05

created:   5:6:2008  

           Vision     0.8

           file base: uti::thread

           file ext:  h

author:       lingfei.tang

 

           copyright(c) 2008.9

 

           stlflingfeitang@gmail.com

 

           歡迎使用本輕量級的線程類庫---uti::thread

 

           目前版本只支持Win32操作系統(tǒng),且需要boost庫的支持,

           但只需引入頭文件, 可免去編譯boost的漫長等待過程

           請注意boost::thread是需要編譯才能使用的, 而且已經(jīng)比較龐大復雜。

 

           本線程庫支持兩種形式的函數(shù)簽名:

           1. 若是自由函數(shù)(全局函數(shù)):

           RT func_name(PT param);

           RT, PT 均已泛化. 即帶一個參數(shù)的自由函數(shù)都滿足條件

 

           2. 若是成員函數(shù):

           RT memb_func_name(void);

           父類, 和返回型別已經(jīng)被泛化.

           以上兩種形式的函數(shù)其實已經(jīng)可以滿足大多數(shù)需求, 且形式簡潔.

 

           ***你可以自由使用本庫, 但請保留本說明和作者名及聯(lián)系方式***

          

           0.8版本已經(jīng)過單元測試.

 

           若有問題或建議請與我聯(lián)系:-)stlflingfeitang@gmail.com

 

This code may be used in compiled form in any way you desire. This

file may be redistributed unmodified by any means PROVIDING it is

not sold for profit without the authors written consent, and

providing that this notice and the authors name and all copyright

notices remains intact.

 

An email letting me know how you are using it would be nice as well.

 

This file is provided "as is" with no expressed or implied warranty.

The author accepts no liability for any damage/loss of business that

this product may cause.

 

*******************************************************************/

/*--------------------------使用說明-------------------------------

 

本線程類的使用時簡單且靈活的:

1. 在線程對象的構(gòu)造函數(shù)中傳入你的線程函數(shù)指針, 以及相關參數(shù)

    eg:

    void freefunc(void*p){}//自由函數(shù)

    uti::thread thread_1(&freefunc, NULL);

 

    class aclass{public: threadfunc(){}};

    aclass ainstan;//對象

    uit::thread thread_2(&aclass::threadfunc, &ainstan);

      

2. 調(diào)用start方法即可以啟動線程

    eg:

    thread_1->start();

    thread_2->start();

 

3. 調(diào)用join方法可以等待線程的退出,在線程對象析構(gòu)時可以保證該線程的退出

    eg:

    thread_1->join();

    thread_2->join();

 

另外,在后面還提供了兩個用于繼承復用的包裝類, 繼承復用可能時最簡單的,但是耦合也是較高的:-)

    eg:

    class mythreadclass :public ThreadObjBase

    {

       void Run

       {

           //...重寫該線程函數(shù)

       }

    }

 

***需要特別說明的是:請確保你的線程函數(shù)是可以解棧的,否則利用該函數(shù)創(chuàng)建的線程將無法退出:(

 

------------------------------------------------------------------*/

/*modification record

08-08-29 by tlf :為了支持友元方式的訪問, 將Thread_MemFun中的原對象的動態(tài)創(chuàng)建

               移到父類thread 中創(chuàng)建.

*/

 

#if !defined(_UTI_THREAD__)

#define _UTI_THREAD__

 

//#include "utidef.h"http://如果你想只使用本線程類, 請注釋該行

#include <Windows.h>

#include <process.h>

#include <boost\function.hpp>

#include <boost\shared_ptr.hpp>

#include <vector>

 

#if !defined(_UTI_DEF__)

#define  BEGIN_UTI

#define  END_UTI

#else

#include <iostream>

#endif

 

BEGIN_UTI

 

 

class ThreadFunbase {public: virtual void run() = 0;};

template<typename RT, typename CT>

class Thread_MemFun: public ThreadFunbase

{

public:

    typedef RT(CT::*FT)();

    explicit Thread_MemFun( RT(CT::*f)(), CT *pcobj):m_fp(f), m_p(pcobj)

    {}

 

    virtual void run()

    {

       if (m_p)

           (m_p->*m_fp)();

       else

           throw std::logic_error("the thread function have no owner!");

    }

 

private:

    CT *m_p;

    FT m_fp;

};

 

template<typename RT, typename PT>

class Thread_Fun: public ThreadFunbase

{

public:

    explicit Thread_Fun(RT(*f)(PT), PT param){

       m_funptor = f;

       m_param = param;

    }

 

    virtual void run()

    {

       m_funptor(m_param);

    }

private:

    boost::function1<RT, PT> m_funptor;

    PT m_param;

};

 

class thread

{

public:

    template<typename RT, typename CT>

       explicit thread(RT(CT::*f)(), CT *pcobj = NULL, std::string thread_name= ""):

    m_thread_name(thread_name),m_id(0), m_threadhandle(0), m_bisrunning(false), m_bisout(true)

    {

       CT *po = pcobj;

       if (NULL == po)

       {

           get_static_obj_ptr(&po);

       }

       m_pfunptor.swap(boost::shared_ptr<ThreadFunbase>(new Thread_MemFun<RT, CT>(f, po)));

 

    }

    template<typename RT, typename PT>

       explicit thread( RT(*f)(PT), PT param, std::string thread_name= ""):

    m_thread_name(thread_name),m_id(0), m_threadhandle(0), m_bisrunning(false)

    {  

       m_pfunptor.swap(boost::shared_ptr<ThreadFunbase>(new Thread_Fun<RT,PT>(f, param)));

    }

 

    virtual ~thread()

    {

       join();

    }

 

    inline unsigned int getid() const

    {

       return m_id;

    }

 

    inline void start()

    {

        

       if (!m_bisrunning){

           m_threadhandle = reinterpret_cast<HANDLE>

              (_beginthreadex(0, 0, threadfun, this, 0, &m_id));     

           m_bisout = false;//we must used it in two thread for sync

 

           while(!m_bisrunning && !m_bisout){ //blocking to waiting thread running

#ifdef ___UTI_DEBUG

              std::cout<<"###the thread is waiting for start! "<< std::endl;

#endif

              Sleep(2);

           }

           //Sleep(8);

       }

    }

 

    inline bool IsRunning() const

    {

       return m_bisrunning;

    }

 

    inline void join()

    {

       if (m_threadhandle)

           ::WaitForSingleObject(m_threadhandle, INFINITE);

       ::CloseHandle(m_threadhandle);

       m_threadhandle = 0;

    }

 

 

private:

    std::string m_thread_name;

 

    boost::shared_ptr<ThreadFunbase> m_pfunptor;

 

    HANDLE m_threadhandle;

    unsigned int m_id;

    bool m_bisrunning;

    bool m_bisout;

 

    virtual void run()

    {

       try{

           m_bisrunning = true;

           m_pfunptor->run();

           m_bisout = true;

           m_bisrunning = false;

       }

       catch(...)

       {

           throw std::logic_error("\r\n exception found in thread func! \r\n");

       }

    }

 

    //now we are in another thread :-)

    static unsigned __stdcall threadfun(void *threadenti)

    {

       thread * th = reinterpret_cast<thread*>(threadenti);

       th->run();

       return 0;

    }

 

    template<typename CT> CT *get_static_obj_ptr(CT **po = NULL)

    {

       static std::vector<boost::shared_ptr<CT> > v_ct;

       boost::shared_ptr<CT> sp_ct(new CT);

       v_ct.push_back(sp_ct);

       return sp_ct.get();

    }

};

 

class ThreadObjBase

{

public:

    enum ATACH_DETACH{ATTCH = 0, DETACH};

    ThreadObjBase(ATACH_DETACH a_or_d = ATTCH): m_bNeedStop(false), m_a_or_d(a_or_d)

    {}

    virtual ~ThreadObjBase()

    {

       m_pth->join();

    }

    void Start()

    {

       if (ATTCH == m_a_or_d)

       {

           m_pth = boost::shared_ptr<thread>(new thread(&ThreadObjBase::Thread_Start,this));

           m_pth->start();

       }

       if (DETACH == m_a_or_d) 

       {

           m_pth = boost::shared_ptr<thread>(new thread(&ThreadObjBase::Thread_Start));

           m_pth->start();

          

       }

    }

    inline void NotifyStop()

    {

       m_bNeedStop = true;

    }

 

    void Join()

    {

       m_pth->join();

    }

 

public:   

    virtual void Run(){}

 

private:

    void Thread_Start()

    {

       Run();

    }

 

    boost::shared_ptr<thread> m_pth;

    bool m_bNeedStop;

    ATACH_DETACH m_a_or_d;

};

 

template <typename DT>

class ThreadObjBase_T

{

public:

    enum ATACH_DETACH{ATTCH = 0, DETACH};

    ThreadObjBase_T(ATACH_DETACH a_or_d = ATTCH):m_bNeedStop(FALSE), m_a_or_d(a_or_d)

    {}

    virtual ~ThreadObjBase_T()

    {

       m_pth->join();

    }

    void start()

    {

       if (ATTCH == m_a_or_d){

           m_pth = boost::shared_ptr<thread>(new thread(&DT::Run, static_cast<DT*>(this)));

           m_pth->start();

       }

       if (DETACH == m_a_or_d){

           m_pth = boost::shared_ptr<thread>(new thread(&DT::Run));

           m_pth->start();

       }

    }

    inline void notify_stop()

    {

       m_bNeedStop = TRUE;

    }

    void join()

    {

       m_pth->join();

    }

private:

    boost::shared_ptr<thread> m_pth;

    bool m_bNeedStop;

    ATACH_DETACH m_a_or_d;

};

 

 

END_UTI

 

#endif

 

//===================================================================

//example

#include "thread.h"

#include <iostream>

#include <stdlib.h>

 

bool g_needstop = false;

int g_count = 0;

 

void globle_func(int np)

{

    std::cout << "------- globle_func start--------" <<std::endl;

    while(1)

{

       if (g_needstop)

           break;

       std::cout << ">>in globle_func countint:" <<g_count++ <<" param:" << np << std::endl;

       Sleep(200);

    }

    std::cout << "------- globle_func exit--------" <<std::endl;

}

 

class uti_thread_test_cls

{

public:

    void mem_func()

    {

       std::cout << "------- uti_thread_test_cls::mem_func start--------" <<std::endl;

       while(1)

       {

           if (g_needstop)

              break;

           std::cout <<">>in uti_thread_test_cls::mem_func count:"<< g_count++ << std::endl;

           Sleep(200);

       }  

       std::cout << "------- uti_thread_test_cls::mem_func exit--------" <<std::endl;

    }

};

 

 

//線程類的簡單使用。

int main(int argc, char* argv[])

{

    {

    thread thread_1(globle_func, 100);

    thread_1.start();

 

    uti_thread_test_cls cls_mem;

    thread thread_2(&uti_thread_test_cls::mem_func, &cls_mem);

    thread_2.start();

 

    ::system("pause\r\n");

    g_needstop = true;

    }

 

    ::system("pause\r\n");

 

    return 0;

}

      昨天我通過zoundry將此文發(fā)表在本BLOG之中, 后來我通過網(wǎng)頁才看到排版很糟糕(至今我還沒有發(fā)現(xiàn)完美的BLOG桌面軟件:-(,  如果大家有什么好的blog桌面軟件也希望可以介紹一下, 在這里先謝謝了 ^_^), 故今天稍作調(diào)整重新發(fā)表。



posted on 2008-10-19 03:23 stlf 閱讀(184) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統(tǒng)計

常用鏈接

留言簿

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品1区| 亚洲免费观看| 午夜一区二区三区不卡视频| 日韩亚洲国产精品| 欧美日韩免费观看中文| 99热免费精品在线观看| 亚洲精品国产品国语在线app| 男同欧美伦乱| 夜夜嗨一区二区| 亚洲午夜久久久| 国产午夜精品全部视频播放| 卡一卡二国产精品| 免费日韩成人| 亚洲一区二区三区成人在线视频精品| 一二三区精品| 国产视频久久久久| 欧美高清成人| 欧美揉bbbbb揉bbbbb| 久久精品国产第一区二区三区| 久久aⅴ国产欧美74aaa| 亚洲日本中文字幕| 制服诱惑一区二区| 精品999在线播放| 99国产精品久久久| 国产亚洲欧美日韩一区二区| 欧美激情视频网站| 国产精品亚洲综合一区在线观看| 久久久久久电影| 欧美精品二区三区四区免费看视频| 亚洲一区二区三区色| 欧美一区午夜视频在线观看| 亚洲精品国产拍免费91在线| 亚洲香蕉视频| 亚洲欧洲日本专区| 午夜精品亚洲一区二区三区嫩草| 亚洲精品免费在线播放| 午夜精品一区二区三区电影天堂| 亚洲经典在线| 翔田千里一区二区| 亚洲视频中文字幕| 免费久久精品视频| 久久理论片午夜琪琪电影网| 欧美日韩三级视频| 免费日韩视频| 国内成人精品2018免费看| 亚洲三级视频在线观看| 有码中文亚洲精品| 亚洲女人天堂av| 亚洲视频免费观看| 欧美激情一区二区久久久| 老妇喷水一区二区三区| 国产精品视频精品| 一本色道88久久加勒比精品| 亚洲国产精品传媒在线观看| 欧美一区二区视频免费观看| 亚洲小视频在线观看| 欧美日韩ab片| 亚洲区国产区| 亚洲精品你懂的| 欧美成人午夜激情| 亚洲国产欧美国产综合一区| 激情综合网址| 久久精品视频在线| 久久久久综合一区二区三区| 国产麻豆精品theporn| 亚洲免费中文| 亚洲综合大片69999| 欧美四级电影网站| 9l国产精品久久久久麻豆| 日韩视频在线一区二区三区| 欧美理论电影在线播放| 亚洲国产二区| 一本高清dvd不卡在线观看| 欧美日韩国产91| 一区二区免费看| 亚洲免费在线观看| 国产精品毛片va一区二区三区| 一本综合久久| 欧美在线视频一区| 国产综合第一页| 奶水喷射视频一区| 亚洲精品一区在线| 午夜精品福利一区二区蜜股av| 国产精品国产三级国产专区53| 亚洲天堂免费观看| 久久激情婷婷| 亚洲黄色性网站| 欧美日韩大片一区二区三区| 这里只有精品电影| 久久久久久国产精品mv| 在线免费日韩片| 欧美人交a欧美精品| 99视频一区二区| 久久久噜噜噜久久狠狠50岁| 亚洲黄色影院| 欧美视频久久| 久久精品一二三区| 亚洲激情第一区| 性久久久久久久| 亚洲国产91精品在线观看| 欧美日韩亚洲视频一区| 性8sex亚洲区入口| 亚洲茄子视频| 久久精品人人做人人综合| 曰韩精品一区二区| 欧美视频中文一区二区三区在线观看| 午夜亚洲影视| 亚洲精品久久久久久久久久久久| 欧美一区二区三区四区在线| 亚洲人成网站色ww在线 | 久久久久久亚洲精品不卡4k岛国| 一区二区在线观看视频| 欧美日韩在线精品一区二区三区| 亚洲欧美日韩国产中文在线| 亚洲国产高清一区二区三区| 久久精品123| 亚洲丝袜av一区| 亚洲黄色免费| 国产视频一区三区| 欧美午夜视频| 欧美成人综合| 久久亚洲风情| 久久xxxx精品视频| 亚洲一区免费观看| 亚洲福利小视频| 榴莲视频成人在线观看| 欧美一区=区| 亚洲自拍偷拍一区| 一区二区三区蜜桃网| 亚洲国产91精品在线观看| 国产一区二区中文字幕免费看| 欧美深夜影院| 欧美日韩三级在线| 欧美精品成人在线| 欧美成人亚洲成人| 六月婷婷一区| 蜜桃精品久久久久久久免费影院| 欧美专区一区二区三区| 亚洲欧美视频在线观看| 亚洲欧美不卡| 亚洲综合色丁香婷婷六月图片| 99在线精品视频在线观看| 亚洲人成小说网站色在线| 亚洲国产免费看| 亚洲人午夜精品免费| 欧美激情一区二区三区在线视频观看 | 另类天堂av| 久久久福利视频| 欧美中文字幕精品| 久久男人av资源网站| 久久免费精品视频| 美女免费视频一区| 欧美黑人一区二区三区| 欧美激情一区| 欧美视频精品在线| 国产精品一区二区久久国产| 国产欧美精品日韩区二区麻豆天美| 国产精品进线69影院| 国产精品大片| 国产日韩精品久久久| 精东粉嫩av免费一区二区三区| 伊人婷婷久久| 亚洲精品久久久久中文字幕欢迎你 | 欧美日本精品| 国产精品亚洲综合一区在线观看| 国产日韩欧美日韩| 在线观看一区二区精品视频| 亚洲人体1000| 亚洲欧美日韩视频一区| 久久久久久穴| 最近中文字幕日韩精品| 亚洲调教视频在线观看| 欧美中日韩免费视频| 免播放器亚洲一区| 欧美午夜精品理论片a级按摩| 国产精品日本欧美一区二区三区| 国产一区二区三区四区hd| 亚洲激情在线观看| 亚洲一区三区视频在线观看 | 亚洲国内精品| 亚洲自拍电影| 欧美激情一区二区三区四区| 中文日韩在线| 另类综合日韩欧美亚洲| 国产精品久久久久一区| 在线日韩成人| 亚洲欧美高清| 欧美激情一区二区久久久| 一区二区三区.www| 久久一本综合频道| 国产精品日日摸夜夜摸av| 91久久精品一区二区三区| 欧美一级理论片| 亚洲精品乱码久久久久久久久| 午夜影院日韩| 欧美日韩视频一区二区| 亚洲国产精品成人久久综合一区| 香蕉久久夜色精品国产| 日韩午夜免费| 久久噜噜噜精品国产亚洲综合 |