最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?boost?thread庫用法詳細講解

 更新時間:2022年11月23日 09:46:25   作者:無水先生  
Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱

一、說明

boost::thread的六種使用方法總結,本文初步介紹線程的函數(shù)、構造、執(zhí)行的詳細解釋。

二、boost::thread的幾個函數(shù)

函數(shù)功能
join()讓主進程等待子線程執(zhí)行完畢后再繼續(xù)執(zhí)行
get_id()獲得線程的 id 號
detach()標線程就成為了守護線程,駐留后臺運行
bool joinable()是否已經(jīng)啟動,為 join()

thread::join()是個簡單暴力的方法,主線程等待子進程期間什么都不能做,一般情形是主線程創(chuàng)建thread object后做自己的工作而不是簡單停留在join上。

thread::join()還會清理子線程相關的內存空間,此后thread object將不再和這個子線程相關了,即thread object不再joinable了,所以join對于一個子線程來說只可以被調用一次,為了實現(xiàn)更精細的線程等待機制,可以使用條件變量等機制。

1、可會合(joinable):這種關系下,主線程需要明確執(zhí)行等待操作,在子線程結束后,主線程的等待操作執(zhí)行完畢,子線程和主線程會合,這時主線程繼續(xù)執(zhí)行等待操作之后的下一步操作。主線程必須會合可會合的子線程。在主線程的線程函數(shù)內部調用子線程對象的wait函數(shù)實現(xiàn),即使子線程能夠在主線程之前執(zhí)行完畢,進入終止態(tài),也必須執(zhí)行會合操作,否則,系統(tǒng)永遠不會主動銷毀線程,分配給該線程的系統(tǒng)資源也永遠不會釋放。

2、相分離(detached):表示子線程無需和主線程會合,也就是相分離的,這種情況下,子線程一旦進入終止狀態(tài),這種方式常用在線程數(shù)較多的情況下,有時讓主線程逐個等待子線程結束,或者讓主線程安排每個子線程結束的等待順序,是很困難或不可能的,所以在并發(fā)子線程較多的情況下,這種方式也會經(jīng)常使用。

三、構造

boost::thread有兩個構造函數(shù):

(1)thread():構造一個表示當前執(zhí)行線程的線程對象;

(2)explicit thread(const boost::function0<void>& threadfunc):

boost::function0<void>可以簡單看為:一個無返回(返回void),無參數(shù)的函數(shù)。這里的函數(shù)也可以是類重載operator()構成的函數(shù);該構造函數(shù)傳入的是函數(shù)對象而并非是函數(shù)指針,這樣一個具有一般函數(shù)特性的類也能作為參數(shù)傳入,在下面有例子。

#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; 
}

執(zhí)行結果:

第二種情況:類重載operator()構成的函數(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; 
} 

運算結果:

第三種情況:在類內部對static函數(shù)創(chuà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方法。因為static方法要比main方法提前加載,所以static方法不能調用一般方法,進一步說,static方法無法調用比它晚加載的方法,切記。 調用時用HelloWorld::start(),說明start在定義類的時候就已經(jīng)ready,無需在實例化后再調用。

第四種情況:使用boost::bind函數(shù)創(chuàng)建線程

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream> 
#include <boost/function.hpp>
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::function<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;
}

1)定義函數(shù)指針 boost::function0< void> f

2)該指針與HelloWorld::hello函數(shù)綁定, boost::bind(&HelloWorld::hello, this);

3)線程與函數(shù)指針綁定 boost::thread thrd(f);

4)按照常規(guī),將對象實例化后,調用類函數(shù)。

運算結果:

第五種情況:在Singleton模式內部創(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;
} 

此例將類對象實例化放在類內部函數(shù)中,因此無需顯式實例化,就可以調用類內函數(shù)。值得研究消化。

第六種情況:在類外用類內部函數(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ù)定義?本例就是參考方法!

到此這篇關于C++ boost thread庫用法詳細講解的文章就介紹到這了,更多相關C++ boost thread內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言算法練習之佩奇借書

    C語言算法練習之佩奇借書

    這篇文章主要該大家分享C語言佩奇借書的練習,文章主要通過描述佩奇借書的問題然后確定程序框架將結果運算出來,下面來看詳細內容吧,需要的朋友可以參考一下
    2022-03-03
  • C++二維數(shù)組螺旋加密信息

    C++二維數(shù)組螺旋加密信息

    大家好,本篇文章主要講的是C++二維數(shù)組螺旋加密信息,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++如何計算二進制數(shù)中1的個數(shù)

    C++如何計算二進制數(shù)中1的個數(shù)

    這篇文章主要介紹了C++如何計算二進制數(shù)中1的個數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++中replace()?函數(shù)的基本用法

    C++中replace()?函數(shù)的基本用法

    今天就跟大家聊聊有關C++中replace()函數(shù)的作用是什么,可能很多人都不太了解,為了讓大家更加了解,這篇文章主要給大家介紹了關于C++中replace()?函數(shù)的基本用法,需要的朋友可以參考下
    2021-11-11
  • C語言模擬實現(xiàn)動態(tài)通訊錄

    C語言模擬實現(xiàn)動態(tài)通訊錄

    本文主要介紹了C語言模擬實現(xiàn)動態(tài)通訊錄,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 基于C語言實現(xiàn)五子棋游戲

    基于C語言實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言深入講解指針與結構體的使用

    C語言深入講解指針與結構體的使用

    指針提供了對地址操作的一種方法,因此,使用指針可使得C語言能夠更高效地實現(xiàn)對計算機底層硬件的操作。另外,通過指針可以更便捷地操作數(shù)組。C數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結構是C編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲不同類型的數(shù)據(jù)項
    2022-05-05
  • 在matlab中實現(xiàn)for循環(huán)的方法

    在matlab中實現(xiàn)for循環(huán)的方法

    for循環(huán)用來循環(huán)處理數(shù)據(jù),break用于終止離它最近的一層for循環(huán),continue用于跳過離它最近的一層for循環(huán),接著執(zhí)行下一次循環(huán),本文重點給大家介紹在matlab中實現(xiàn)for循環(huán)的方法,感興趣的朋友一起看看吧
    2021-11-11
  • C++ txt 文件讀取,并寫入結構體中的操作

    C++ txt 文件讀取,并寫入結構體中的操作

    這篇文章主要介紹了C++ txt 文件讀取,并寫入結構體中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 總結UNIX/LINUX下C++程序計時的方法

    總結UNIX/LINUX下C++程序計時的方法

    本文總結了下UNIX/LINUX下C++程序計時的一些函數(shù)和方法,對日常使用C++程序的朋友很有幫助,有需要的小伙伴們可以參考學習,下面一起來看看吧。
    2016-08-08

最新評論

扶绥县| 五家渠市| 西吉县| 沂源县| 遵义市| 无为县| 琼中| 神池县| 平昌县| 正阳县| 丰台区| 吴川市| 弥勒县| 库伦旗| 乌海市| 巴塘县| 霍城县| 宜昌市| 布尔津县| 神木县| 嵊州市| 肃宁县| 廉江市| 治多县| 新源县| 和顺县| 图木舒克市| 普安县| 本溪市| 梁河县| 若尔盖县| 都昌县| 寿光市| 怀宁县| 保定市| 肥东县| 鄂伦春自治旗| 玛多县| 固镇县| 林芝县| 咸阳市|