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

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一区二区三区在线观看| 国色天香一区二区| 激情国产一区| 99国产精品国产精品久久| 亚洲综合久久久久| 久久综合久久88| 欧美激情在线有限公司| 一本色道久久88综合日韩精品| 亚洲资源av| 美国十次成人| 欧美日韩一区在线播放| 国产精品理论片在线观看| 国产日韩精品一区| 亚洲精品一区二区三区在线观看| 中文网丁香综合网| 美女网站久久| 亚洲一区二区三区免费观看| 久久人人97超碰精品888| 欧美日韩在线视频观看| 黄色亚洲精品| 亚洲国产精品日韩| 亚洲视频播放| 亚洲自拍偷拍网址| 激情另类综合| 日韩视频免费观看| 久久九九热免费视频| 国产精品xnxxcom| 亚洲伦理在线免费看| 美女图片一区二区| 欧美少妇一区二区| 免费高清在线一区| 国产精品久久久久久久久婷婷| 久久久久国产精品一区三寸| 亚洲一区二区三区高清| 亚洲国产91| 久久精品免视看| 欧美在线三级| 国产一区二区黄色| 久久精品成人一区二区三区| 欧美好骚综合网| 99国产精品久久久| 久久久精彩视频| 亚洲欧美在线网| 亚洲欧美中文在线视频| 国产精品亚洲美女av网站| 亚洲欧美一区二区激情| 欧美大片一区二区三区| 亚洲精品在线观看免费| 欧美专区中文字幕| 亚洲自拍啪啪| 欧美日韩精品中文字幕| 亚洲天堂av图片| 欧美高清视频一二三区| 久久在线91| 国产在线精品成人一区二区三区| 久久美女性网| 乱码第一页成人| 久久躁日日躁aaaaxxxx| 国产日韩视频| 欧美国产免费| 亚洲电影在线播放| 亚洲欧洲三级| 国产乱理伦片在线观看夜一区 | 欧美精品大片| 亚洲午夜一区二区三区| 欧美一区二区三区四区高清| 在线播放不卡| aaa亚洲精品一二三区| 国产精品久久久久久久久久ktv| 久久久久久午夜| 国产亚洲欧洲一区高清在线观看| 亚洲一区二区三区在线| 亚洲欧美日韩国产成人| 久久夜色精品国产欧美乱极品| 免费不卡中文字幕视频| 极品少妇一区二区| 老鸭窝亚洲一区二区三区| 亚洲欧美日韩一区在线| 国产精品一区二区久久国产| 先锋a资源在线看亚洲| 亚洲国产精品女人久久久| 毛片一区二区三区| 亚洲精品在线二区| 伊人成人网在线看| 老司机一区二区三区| 亚洲人成毛片在线播放| 国语自产在线不卡| 免费中文日韩| 久久久青草青青国产亚洲免观| 国内精品美女在线观看| 免费看的黄色欧美网站| 日韩午夜激情| 久久久久国产精品www| 亚洲高清在线| 国产精品白丝av嫩草影院| 性做久久久久久久久| 欧美激情中文字幕乱码免费| 亚洲一区二区三区乱码aⅴ| 国产在线观看一区| 欧美日本三级| 亚洲国产中文字幕在线观看| 亚洲伊人第一页| 激情五月综合色婷婷一区二区| 你懂的亚洲视频| 亚洲欧美国产另类| 亚洲第一精品影视| 在线日韩电影| 国产精品久久久久久久久果冻传媒 | 国产综合在线看| 欧美久久久久久久久久| 久久高清国产| 久久免费视频一区| 亚洲图片在线| 亚洲国产天堂久久国产91| 久热精品视频在线| 亚洲制服欧美中文字幕中文字幕| 免费视频一区| 久久国产夜色精品鲁鲁99| 亚洲乱码国产乱码精品精| 黄色国产精品一区二区三区| 欧美日韩一区在线观看视频| 美女脱光内衣内裤视频久久网站| 亚洲嫩草精品久久| 99国产精品久久久| 欧美激情四色| 免费日韩视频| 久久亚洲免费| 久久精品国产999大香线蕉| 中文av字幕一区| 亚洲九九九在线观看| 在线视频观看日韩| 激情成人av在线| 国产视频精品xxxx| 国产精品亚洲一区| 欧美午夜宅男影院在线观看| 欧美欧美午夜aⅴ在线观看| 欧美电影免费观看高清| 麻豆精品视频在线| 久久全国免费视频| 久久婷婷亚洲| 免费观看日韩| 欧美激情第三页| 欧美高清免费| 欧美精品一二三| 欧美日韩激情小视频| 欧美日本亚洲| 国产精品久久精品日日| 欧美三级在线视频| 国产精品成人午夜| 国产精品国产三级国产普通话蜜臀| 欧美日韩激情网| 国产精品麻豆va在线播放| 国产精品免费一区二区三区观看| 欧美性做爰毛片| 国产精品入口尤物| 国产中文一区二区三区| 黄色成人小视频| 亚洲欧洲日产国产综合网| 国产精品尤物| 黄色精品一区二区| 亚洲精品乱码久久久久久日本蜜臀 | 国产精品第一区| 国产精品视频网| 国产在线观看一区| 亚洲福利视频三区| 宅男精品视频| 亚洲高清一区二区三区| 日韩视频一区二区三区在线播放| 在线综合欧美| 久久久水蜜桃| 亚洲激情第一页| 亚洲自拍高清| 男女av一区三区二区色多| 欧美另类视频在线| 国产日韩欧美三区| 日韩视频在线免费| 欧美一区二区三区在线观看| 欧美成人四级电影| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲午夜在线观看| 一本色道久久综合狠狠躁篇的优点 | 久久久久久久久久久久久女国产乱| 男人的天堂亚洲| 久久中文欧美| 99精品欧美一区二区三区综合在线| 亚洲欧美影院| 欧美精品亚洲二区| 黑丝一区二区三区| 亚洲欧美视频在线观看视频| 免费亚洲一区二区| 午夜精品久久久久99热蜜桃导演| 欧美不卡视频一区发布| 国产日韩综合一区二区性色av| 亚洲麻豆av| 免费不卡中文字幕视频| 亚洲欧美日本另类| 欧美日韩综合久久| 亚洲美女黄色片|