<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    boost::thread用法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    最近在做一個消息中間件里面涉及到多線程編程,由于跨平臺的原因我采用了boost線程庫。在創建線程時遇到了幾種線程創建方式現總結如下:  

      首先看看boost::thread的構造函數吧,boost::thread有兩個構造函數: 
    (1)thread():構造一個表示當前執行線程的線程對象; 
    (2)explicit thread(const boost::function0<void>& threadfunc): 
         boost::function0<void>可以簡單看為:一個無返回(返回void),無參數的函數。這里的函數也可以是類重載operator()構成的函數;該構造函數傳入的是函數對象而并非是函數指針,這樣一個具有一般函數特性的類也能作為參數傳入,在下面有例子。 
    第一種方式:最簡單方法 
    #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; 

    第二種方式:復雜類型對象作為參數來創建線程: 
    #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; 

    第三種方式:在類內部創建線程; 
    (1)類內部靜態方法啟動線程 
    #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()方法不能是靜態方法則采用下面的方法創建線程: 
    #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模式內部創建線程: 
    #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;

    第四種方法:用類內部函數在類外部創建線程; 
    #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;

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全