小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

boost::thread線程創(chuàng)建方式總結(jié)

 MikeDoc 2012-01-03

最近在做一個(gè)消息中間件里面涉及到多線程編程,由于跨平臺(tái)的原因我采用了boost線程庫(kù)。在創(chuàng)建線程時(shí)遇到了幾種線程創(chuàng)建方式現(xiàn)總結(jié)如下:  
  首先看看boost::thread的構(gòu)造函數(shù)吧,boost::thread有兩個(gè)構(gòu)造函數(shù): 
(1)thread():構(gòu)造一個(gè)表示當(dāng)前執(zhí)行線程的線程對(duì)象; 
(2)explicit thread(const boost::function0<void>& threadfunc): 
     boost::function0<void>可以簡(jiǎn)單看為:一個(gè)無返回(返回void),無參數(shù)的函數(shù)。這里的函數(shù)也可以是類重載operator()構(gòu)成的函數(shù);該構(gòu)造函數(shù)傳入的是函數(shù)對(duì)象而并非是函數(shù)指針,這樣一個(gè)具有一般函數(shù)特性的類也能作為參數(shù)傳入,在下面有例子。


第一種方式:最簡(jiǎn)單方法 
#include <boost/thread/thread.hpp> 
#include <iostream> 
  
void hello() 

        std::cout << 
        "Hello world, I''m a thread!" 
        << std::endl; 

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

        boost::thread thrd(&hello); 
        thrd.join(); 
        return 0; 
}


第二種方式:復(fù)雜類型對(duì)象作為參數(shù)來創(chuàng)建線程: 
#include <boost/thread/thread.hpp> 
#include <boost/thread/mutex.hpp> 
#include <iostream> 
  
boost::mutex io_mutex; 
  
struct count 

        count(int id) : id(id) { } 
        
        void operator()() 
        { 
                for (int i = 0; i < 10; ++i) 
                { 
                        boost::mutex::scoped_lock 
                        lock(io_mutex); 
                        std::cout << id << ": " 
                        << i << std::endl; 
                } 
        } 
        
        int id; 
}; 
  
int main(int argc, char* argv[]) 

        boost::thread thrd1(count(1)); 
        boost::thread thrd2(count(2)); 
        thrd1.join(); 
        thrd2.join(); 
        return 0; 
}


第三種方式:在類內(nèi)部創(chuàng)建線程; 
(1)類內(nèi)部靜態(tài)方法啟動(dòng)線程 
#include <boost/thread/thread.hpp>
#include <iostream> 
class HelloWorld
{
public:
 static void hello()
 {
      std::cout <<
      "Hello world, I''m a thread!"
      << std::endl;
 }
 static void start()
 {
  
  boost::thread thrd( hello );
  thrd.join();
 }
 
}; 
int main(int argc, char* argv[])
{
 HelloWorld::start();
 
 return 0;

在這里start()和hello()方法都必須是static方法。


(2)如果要求start()和hello()方法不能是靜態(tài)方法則采用下面的方法創(chuàng)建線程: 
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream> 
class HelloWorld
{
public:
 void hello()
 {
    std::cout <<
    "Hello world, I''m a thread!"
    << std::endl;
 }
 void start()
 {
  boost::function0< void> f =  boost::bind(&HelloWorld::hello,this);
  boost::thread thrd( f );
  thrd.join();
 }
 
}; 
int main(int argc, char* argv[])
{
 HelloWorld hello;
 hello.start();
 return 0;
}


(3)在Singleton模式內(nèi)部創(chuàng)建線程: 
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream> 
class HelloWorld
{
public:
 void hello()
 {
    std::cout <<
    "Hello world, I''m a thread!"
    << std::endl;
 }
 static void start()
 {
  boost::thread thrd( boost::bind  
                   (&HelloWorld::hello,&HelloWorld::getInstance() ) ) ;
  thrd.join();
 }
 static HelloWorld& getInstance()
 {
  if ( !instance )
      instance = new HelloWorld;
  return *instance;
 }
private: 
 HelloWorld(){}
 static HelloWorld* instance;
 
}; 
HelloWorld* HelloWorld::instance = 0; 
int main(int argc, char* argv[])
{
 HelloWorld::start();

 return 0;
}


第四種方法:用類內(nèi)部函數(shù)在類外部創(chuàng)建線程; 
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <string>
#include <iostream> 
class HelloWorld
{
public:
 void hello(const std::string& str)
 {
        std::cout <<str<< std::endl;
 }
}; 
  
int main(int argc, char* argv[])

 HelloWorld obj;
 boost::thread thrd( boost::bind(&HelloWorld::hello,&obj,"Hello 
                               world, I''m a thread!" ) ) ;
 thrd.join();
 return 0;
}


如果線程需要綁定的函數(shù)有參數(shù)則需要使用boost::bind。比如想使用 boost::thread創(chuàng)建一個(gè)線程來執(zhí)行函數(shù):void f(int i),如果這樣寫:boost::thread thrd(f)是不對(duì)的,因?yàn)閠hread構(gòu)造函數(shù)聲明接受的是一個(gè)沒有參數(shù)且返回類型為void的型別,而且不提供參數(shù)i的值f也無法運(yùn)行,這時(shí)就可以寫:boost::thread thrd(boost::bind(f,1))。涉及到有參函數(shù)的綁定問題基本上都是boost::thread、boost::function、boost::bind結(jié)合起來使用。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多