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

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中應(yīng)該可以看得到:-)).其他類庫將出現(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)比較龐大復(fù)雜。

 

           本線程庫支持兩種形式的函數(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ù)指針, 以及相關(guān)參數(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();

 

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

    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)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

導(dǎo)航

統(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>
            亚洲国产精品美女| 亚洲欧美成人一区二区在线电影 | 欧美大片在线观看一区| 在线观看日韩av| 欧美电影资源| 免费不卡亚洲欧美| 亚洲乱码精品一二三四区日韩在线| 欧美**字幕| 欧美日本三区| 欧美一站二站| 久久免费偷拍视频| 宅男噜噜噜66一区二区66| 在线亚洲欧美| 在线观看免费视频综合| 欧美激情精品久久久六区热门| 欧美国产日韩xxxxx| 亚洲制服欧美中文字幕中文字幕| 亚洲综合精品四区| 在线成人国产| 国产精品99久久99久久久二8| 国精产品99永久一区一区| 你懂的成人av| 国产精品户外野外| 免费成人高清视频| 欧美特黄a级高清免费大片a级| 欧美一区二区三区的| 美女精品在线观看| 西西人体一区二区| 欧美xxx在线观看| 欧美伊人影院| 欧美久色视频| 久久亚洲午夜电影| 国产精品美女www爽爽爽视频| 久久综合狠狠综合久久激情| 欧美日韩综合| 欧美成人免费网站| 国产老肥熟一区二区三区| 亚洲国产欧美一区二区三区久久| 国产精品蜜臀在线观看| 亚洲成人资源| 亚洲一卡久久| 亚洲国产日韩在线一区模特| 亚洲天堂免费观看| 99ri日韩精品视频| 久久夜色精品国产亚洲aⅴ| 亚洲午夜激情网页| 欧美劲爆第一页| 欧美激情精品久久久六区热门 | 激情久久中文字幕| 午夜精品久久久久久99热软件| 日韩午夜激情电影| 欧美成人亚洲成人| 免费人成精品欧美精品| 国产日韩欧美三级| 亚洲一区二三| 亚洲综合国产| 欧美日韩综合一区| 亚洲伦理中文字幕| 日韩午夜免费| 欧美激情综合网| 91久久精品国产91性色| 亚洲黄色免费电影| 欧美大学生性色视频| 欧美国产成人精品| 最新国产拍偷乱拍精品 | 中文久久乱码一区二区| 99视频超级精品| 欧美黄色精品| 亚洲伦理中文字幕| 亚洲一级片在线观看| 国产精品99免费看| 亚洲综合好骚| 久久久欧美精品| 依依成人综合视频| 噜噜噜噜噜久久久久久91| 欧美国产高清| av成人手机在线| 国产精品国产| 欧美一区二区视频在线| 久久综合伊人77777麻豆| 在线观看一区二区精品视频| 久久影院午夜论| 亚洲承认在线| 亚洲无限av看| 国产一区二区三区在线观看精品| 久久成人精品视频| 欧美福利在线| 亚洲一区二区三区久久| 国产午夜精品理论片a级大结局| 久久国产精品高清| 亚洲第一区色| 亚洲永久在线| 狠狠色狠狠色综合日日91app| 噜噜噜在线观看免费视频日韩| 最新国产拍偷乱拍精品| 亚洲欧美日韩一区二区| 好男人免费精品视频| 欧美精品日韩三级| 亚洲欧美综合精品久久成人| 欧美丰满高潮xxxx喷水动漫| 一区二区精品在线| 狠狠色丁香婷综合久久| 欧美日韩一区免费| 久久久久久色| 亚洲一级网站| 欧美国产综合| 久久精品成人一区二区三区| 亚洲人成高清| 国产一区二区成人| 欧美日韩一区二区视频在线| 久久久久久久久伊人| 一本色道久久综合狠狠躁的推荐| 久久婷婷影院| 亚洲综合国产激情另类一区| 亚洲激情视频在线| 国产一区二区三区成人欧美日韩在线观看| 久久中文欧美| 销魂美女一区二区三区视频在线| 最新国产成人av网站网址麻豆| 久久久久久久久久久久久女国产乱 | 欧美日韩在线一二三| 久久精品成人一区二区三区蜜臀 | 一区二区高清| 亚洲国产精品一区二区www| 欧美在线看片a免费观看| 日韩一级视频免费观看在线| 红桃视频国产一区| 国产日产欧美一区| 国产精品美女www爽爽爽| 欧美激情视频在线免费观看 欧美视频免费一 | 久久久久www| 亚洲在线视频一区| 99精品国产高清一区二区| 亚洲夫妻自拍| 亚洲高清在线精品| 欧美好骚综合网| 欧美成va人片在线观看| 久久综合中文字幕| 久久嫩草精品久久久精品| 欧美中文在线观看国产| 午夜精品福利在线| 午夜国产精品影院在线观看| 宅男噜噜噜66一区二区| 一区二区三区 在线观看视| 亚洲精品一区二区三区av| 亚洲国产精品成人va在线观看| 在线观看亚洲视频| 伊人久久大香线| 伊人久久综合| 亚洲精品国产精品国产自| 亚洲国产欧美日韩精品| 亚洲欧洲视频| 夜夜嗨av一区二区三区网页 | 国产偷国产偷精品高清尤物| 国产精品私房写真福利视频 | 久久青草福利网站| 久久久水蜜桃av免费网站| 久久深夜福利免费观看| 免费国产一区二区| 欧美久久久久久久| 国产精品久久国产愉拍| 国产精品视频免费观看| 狠狠色综合播放一区二区| 原创国产精品91| 亚洲精品乱码久久久久久| 一本大道av伊人久久综合| 亚洲制服少妇| 老巨人导航500精品| 亚洲黄网站在线观看| av成人天堂| 久久精品免费播放| 欧美伦理91i| 国产日韩一级二级三级| 亚洲激情在线观看| 亚洲制服av| 久热这里只精品99re8久| 亚洲国产精品va在线观看黑人| 一区二区三区欧美在线| 久久久久久久成人| 欧美日韩一区二区在线观看| 国产亚洲欧美色| 亚洲美女在线观看| 欧美一级片在线播放| 亚洲国产精品久久精品怡红院| 亚洲一区二区毛片| 麻豆成人综合网| 国产情人综合久久777777| 日韩午夜激情电影| 久久女同互慰一区二区三区| 亚洲精品国产精品国自产观看| 欧美一区二区三区视频在线观看| 欧美不卡高清| 国产一区二区三区在线观看免费视频| 亚洲精品久久久蜜桃| 久久久99久久精品女同性| 日韩亚洲在线观看| 欧美岛国在线观看| 激情偷拍久久| 欧美在线一区二区| 日韩亚洲成人av在线|