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

C++ Boost Thread線程使用示例詳解

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

一、并行編程

以下庫支持并行編程模型。

  • Boost.Thread 允許您創(chuàng)建和管理自己的線程。
  • Boost.Atomic 允許您通過多個線程的原子操作訪問整數(shù)類型的變量。
  • Boost.Lockfree 提供線程安全的容器。
  • Boost.MPI 起源于超級計算機領(lǐng)域。使用 Boost.MPI,您的程序可以多次啟動并在多個進程中執(zhí)行。您專注于對應(yīng)該并發(fā)執(zhí)行的實際任務(wù)進行編程,而 Boost.MPI 會協(xié)調(diào)這些過程。使用 Boost.MPI,您無需處理諸如同步訪問共享數(shù)據(jù)之類的細節(jié)。但是,Boost.MPI 確實需要適當(dāng)?shù)倪\行時環(huán)境。

二、生成何管理Threads

        這個庫中最重要的類是 boost::thread,它在 boost/thread.hpp 中定義。此類用于創(chuàng)建新線程。示例 44.1 是一個創(chuàng)建線程的簡單示例。

        例 44.1。使用 boost::thread

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>
void wait(int seconds)
{
  boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
}
void thread()
{
  for (int i = 0; i < 5; ++i)
  {
    wait(1);
    std::cout << i << '\n';
  }
}
int main()
{
  boost::thread t{thread};
  t.join();
}

        新線程應(yīng)該執(zhí)行的函數(shù)的名稱被傳遞給 boost::thread 的構(gòu)造函數(shù)。一旦示例 44.1 中的變量 t 被創(chuàng)建,函數(shù) thread() 立即開始在它自己的線程中執(zhí)行。此時,thread() 與 main() 函數(shù)同時執(zhí)行。

        為了防止程序終止,在新創(chuàng)建的線程上調(diào)用 join()。 join() 阻塞當(dāng)前線程,直到為其調(diào)用 join() 的線程終止。這會導(dǎo)致 main() 等待直到 thread() 返回。

        可以使用變量訪問特定線程 - 在本示例中為 t t - 以等待其終止。但是,即使 t 超出范圍并被銷毀,線程仍將繼續(xù)執(zhí)行。線程一開始總是綁定到 boost::thread 類型的變量,但一旦創(chuàng)建,線程就不再依賴于該變量。甚至還有一個名為 detach() 的成員函數(shù),它允許類型為 boost::thread 的變量與其對應(yīng)的線程分離。不可能在調(diào)用 detach() 之后調(diào)用像 join() 這樣的成員函數(shù),因為分離的變量不再代表有效的線程。

        任何可以在函數(shù)內(nèi)完成的事情也可以在線程內(nèi)完成。歸根結(jié)底,線程與函數(shù)沒有什么不同,只是它與另一個函數(shù)并發(fā)執(zhí)行。在例 44.1 中,循環(huán)中將五個數(shù)字寫入標準輸出流。為了減慢輸出速度,循環(huán)的每次迭代都會調(diào)用 wait() 函數(shù)來暫停一秒鐘。 wait() 使用函數(shù) sleep_for() ,它也由 Boost.Thread 提供并位于命名空間 boost::this_thread 中。

        sleep_for() 需要一個時間段作為其唯一參數(shù),該時間段指示當(dāng)前線程應(yīng)該停止多長時間。通過傳遞類型為 boost::chrono::seconds 的對象,可以設(shè)置一段時間。 boost::chrono::seconds 來自第 37 章介紹的 Boost.Chrono。

        sleep_for() 只接受來自 Boost.Chrono 的類型。盡管 Boost.Chrono 已成為 C++11 標準庫的一部分,但來自 std::chrono 的類型不能與 Boost.Thread 一起使用。這樣做會導(dǎo)致編譯器錯誤。

        如果您不想在 main() 結(jié)束時調(diào)用 join(),您可以使用類 boost::scoped_thread。

        示例 44.2。使用 boost::scoped_thread 等待線程

#include <boost/thread.hpp>
#include <boost/thread/scoped_thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>
void wait(int seconds)
{
  boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
}
void thread()
{
  for (int i = 0; i < 5; ++i)
  {
    wait(1);
    std::cout << i << '\n';
  }
}
int main()
{
  boost::scoped_thread<> t{boost::thread{thread}};
}

        boost::scoped_thread 的構(gòu)造函數(shù)需要一個 boost::thread 類型的對象。在 boost::scoped_thread 的析構(gòu)函數(shù)中,一個動作可以訪問該對象。默認情況下,boost::scoped_thread 使用在線程上調(diào)用 join() 的操作。因此,示例 44.2 的工作方式類似于示例 44.1。

        您可以將用戶定義的操作作為模板參數(shù)傳遞。該操作必須是一個帶有運算符 operator() 的類,該運算符接受 boost::thread 類型的對象。 boost::scoped_thread 保證運算符將在析構(gòu)函數(shù)中調(diào)用。

        您只能在 Boost.Thread 中找到類 boost::scoped_thread。標準庫中沒有對應(yīng)的。確保包含 boost::scoped_thread 的頭文件 boost/thread/scoped_thread.hpp。

        示例 44.3 引入了中斷點,這使得中斷線程成為可能。中斷點僅由 Boost.Thread 支持,標準庫不支持。

        示例 44.3。 boost::this_thread::sleep_for() 的中斷點

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>
void wait(int seconds)
{
  boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
}
void thread()
{
  try
  {
    for (int i = 0; i < 5; ++i)
    {
      wait(1);
      std::cout << i << '\n';
    }
  }
  catch (boost::thread_interrupted&) {}
}
int main()
{
  boost::thread t{thread};
  wait(3);
  t.interrupt();
  t.join();
}

        在線程對象上調(diào)用 interrupt() 會中斷相應(yīng)的線程。在此上下文中,中斷意味著在線程中拋出類型為 boost::thread_interrupted 的異常。但是,這僅在線程到達中斷點時發(fā)生。

        如果給定的線程不包含中斷點,則簡單地調(diào)用 interrupt() 不會有任何效果。每當(dāng)線程到達中斷點時,它都會檢查是否已調(diào)用 interrupt()。如果它已被調(diào)用,將拋出 boost::thread_interrupted 類型的異常。

        Boost.Thread 定義了一系列中斷點,例如 sleep_for() 函數(shù)。因為在示例 44.3 中 sleep_for() 被調(diào)用了五次,線程檢查了五次它是否被中斷。在對 sleep_for() 的調(diào)用之間,線程不能被中斷。

        示例 44.3 沒有顯示五個數(shù)字,因為在 main() 中三秒后調(diào)用了 interrupt()。因此,相應(yīng)的線程被中斷并拋出 boost::thread_interrupted 異常。即使捕獲處理程序為空,異常也會在線程內(nèi)被正確捕獲。因為 thread() 函數(shù)在處理程序之后返回,所以線程也會終止。反過來,這將導(dǎo)致程序終止,因為 main() 正在等待線程終止。

        Boost.Thread 定義了大約十五個中斷點,包括 sleep_for()。這些中斷點使得及時中斷線程變得容易。然而,中斷點可能并不總是最好的選擇,因為它們必須在線程可以檢查 boost::thread_interrupted 異常之前到達。

        示例 44.4。使用 disable_interruption 禁用中斷點

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>
void wait(int seconds)
{
  boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
}
void thread()
{
  boost::this_thread::disable_interruption no_interruption;
  try
  {
    for (int i = 0; i < 5; ++i)
    {
      wait(1);
      std::cout << i << '\n';
    }
  }
  catch (boost::thread_interrupted&) {}
}
int main()
{
  boost::thread t{thread};
  wait(3);
  t.interrupt();
  t.join();
}

        類 boost::this_thread::disable_interruption 防止線程被中斷。如果實例化 boost::this_thread::disable_interruption,只要對象存在,線程中的中斷點就會被禁用。因此,示例 44.4 顯示了五個數(shù)字,因為中斷線程的嘗試被忽略了。

        示例 44.5。使用 boost::thread::attributes 設(shè)置線程屬性

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>
void wait(int seconds)
{
  boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
}
void thread()
{
  try
  {
    for (int i = 0; i < 5; ++i)
    {
      wait(1);
      std::cout << i << '\n';
    }
  }
  catch (boost::thread_interrupted&) {}
}
int main()
{
  boost::thread::attributes attrs;
  attrs.set_stack_size(1024);
  boost::thread t{attrs, thread};
  t.join();
}

boost::thread::attributes 用于設(shè)置線程屬性。在 1.56.0 版本中,您只能設(shè)置一個與平臺無關(guān)的屬性,即堆棧大小。在示例 44.5 中,堆棧大小由 boost::thread::attributes::set_stack_size() 設(shè)置為 1024 字節(jié)。

示例 44.6。檢測線程 ID 和可用處理器的數(shù)量

#include <boost/thread.hpp>
#include <iostream>
int main()
{
  std::cout << boost::this_thread::get_id() << '\n';
  std::cout << boost::thread::hardware_concurrency() << '\n';
}

        在命名空間 boost::this_thread 中,定義了適用于當(dāng)前線程的獨立函數(shù)。其中一個函數(shù)是我們之前見過的 sleep_for()。另一個是 get_id(),它返回一個數(shù)字以唯一標識當(dāng)前線程(參見示例 44.6)。 get_id() 也作為類 boost::thread 的成員函數(shù)提供。

        靜態(tài)成員函數(shù) boost::thread::hardware_concurrency() 返回物理上可以同時執(zhí)行的線程數(shù),基于 CPU 或 CPU 內(nèi)核的基礎(chǔ)數(shù)量。在雙核處理器上調(diào)用此函數(shù)返回值 2。此函數(shù)提供了一種簡單的方法來確定理論上應(yīng)該使用的最大線程數(shù)。

        Boost.Thread 還提供類 boost::thread_group 來管理組中的線程。此類提供的一個函數(shù)是成員函數(shù) join_all(),它等待組中的所有線程終止。

練習(xí)

使用兩個線程計算在 for 循環(huán)中相加的所有數(shù)字的總和:

#include <boost/timer/timer.hpp>
#include <iostream>
#include <cstdint>
int main()
{
    boost::timer::cpu_timer timer;
    std::uint64_t total = 0;
    for (int i = 0; i < 1'000'000'000; ++i)
        total += i;
    std::cout << timer.format();
    std::cout << total << '\n';
}

概括該程序,使其使用盡可能多的線程,可以在計算機上并發(fā)執(zhí)行。例如,如果程序在具有四核 CPU 的計算機上運行,??則該程序應(yīng)該使用四個線程。

到此這篇關(guān)于C++ Boost Thread線程使用示例詳解的文章就介紹到這了,更多相關(guān)C++ Boost Thread內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你深入了解C++中音頻PCM數(shù)據(jù)

    一文帶你深入了解C++中音頻PCM數(shù)據(jù)

    PCM(Pulse Code Modulation)也被稱為脈沖編碼調(diào)制,是數(shù)字通信的編碼方式之一。這篇文章主要和大家聊聊C++中音頻PCM數(shù)據(jù)的相關(guān)操作,需要的可以參考一下
    2023-02-02
  • Qt一個進程運行另一個進程的實現(xiàn)方法

    Qt一個進程運行另一個進程的實現(xiàn)方法

    本文主要介紹了Qt一個進程運行另一個進程的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++中BitBlt的使用方法詳解

    C++中BitBlt的使用方法詳解

    這篇文章主要介紹了C++中BitBlt的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 數(shù)據(jù)結(jié)構(gòu)之伸展樹詳解

    數(shù)據(jù)結(jié)構(gòu)之伸展樹詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之伸展樹詳解,本文對伸展樹(Splay Tree)的單旋轉(zhuǎn)操作、一字型旋轉(zhuǎn)、之字形旋轉(zhuǎn)區(qū)間操作等理論知識做了講解,并給出實現(xiàn)代碼,需要的朋友可以參考下
    2014-08-08
  • C++四種cast使用詳細介紹

    C++四種cast使用詳細介紹

    本文主要介紹了C++四種cast使用詳細介紹,今天我們要來講的是顯式類型轉(zhuǎn)換,C++提供了四種顯式類型轉(zhuǎn)換,分別是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感興趣的可以了解一下
    2022-07-07
  • C語言中宏定義的妙用方法

    C語言中宏定義的妙用方法

    今天小編就為大家分享一篇關(guān)于C語言中宏定義的妙用方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++泛型編程綜合講解

    C++泛型編程綜合講解

    泛型編程與面向?qū)ο缶幊痰哪繕讼嗤?,即使重用代碼和抽象通用概念的技術(shù)更加簡單。但是面向?qū)ο缶幊虖娬{(diào)編程的數(shù)據(jù)方面,泛型編程強調(diào)的是獨立于特定數(shù)據(jù)類型
    2022-12-12
  • C++ STL list 遍歷刪除出錯解決方案

    C++ STL list 遍歷刪除出錯解決方案

    這篇文章主要介紹了C++ STL list 遍歷刪除出錯解決方案的相關(guān)資料,這里對出錯進行分析,并給出正確的解決方法,需要的朋友可以參考下
    2016-12-12
  • C語言實現(xiàn)二叉樹的基本操作

    C語言實現(xiàn)二叉樹的基本操作

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)二叉樹的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C++標準庫實現(xiàn)WAV文件讀寫的操作

    C++標準庫實現(xiàn)WAV文件讀寫的操作

    本文將使用標準C++庫實現(xiàn)對數(shù)據(jù)為PCM格式的WAV文件的讀寫操作,只使用標準C++庫函數(shù),不依賴于其他的庫,對C++標準庫實現(xiàn)WAV文件讀寫相關(guān)知識感興趣的朋友一起看看吧
    2022-01-01

最新評論

威远县| 沂水县| 锡林郭勒盟| 奉化市| 乐安县| 桐城市| 佛山市| 商南县| 满城县| 太和县| 蒙山县| 泸西县| 定边县| 富锦市| 林周县| 石楼县| 崇信县| 黄浦区| 阿克苏市| 千阳县| 佛山市| 桐乡市| 罗甸县| 阳东县| 太保市| 武清区| 肥乡县| 肃宁县| 张家港市| 镇安县| 肃南| 阳山县| 永春县| 常州市| 昆明市| 渑池县| 永和县| 北碚区| 绥化市| 延长县| 库伦旗|