" />

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

C++ Boost Atomic詳細(xì)講解

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

一、說明

Boost.Atomic 提供類 boost::atomic,可用于創(chuàng)建原子變量。它們被稱為原子變量,因為所有訪問都是原子的。 Boost.Atomic 用于多線程程序,當(dāng)在一個線程中訪問變量不應(yīng)被訪問相同變量的另一個線程中斷時。如果沒有 boost::atomic,從多個線程訪問共享變量的嘗試將需要與鎖同步。

boost::atomic 取決于支持原子變量訪問的目標(biāo)平臺。否則,boost::atomic 使用鎖。該庫允許您檢測目標(biāo)平臺是否支持原子變量訪問。

如果您的開發(fā)環(huán)境支持 C++11,則不需要 Boost.Atomic。 C++11 標(biāo)準(zhǔn)庫提供了一個頭文件 atomic,它定義了與 Boost.Atomic 相同的功能。例如,您會發(fā)現(xiàn)一個名為 std::atomic 的類。

Boost.Atomic 支持與標(biāo)準(zhǔn)庫大致相同的功能。雖然一些函數(shù)在 Boost.Atomic 中被重載,但它們在標(biāo)準(zhǔn)庫中可能有不同的名稱。標(biāo)準(zhǔn)庫還提供了一些 Boost.Atomic 中缺少的函數(shù),例如 std::atomic_init() 和 std::kill_dependency()。

二、示例和代碼

示例 45.1。使用 boost::atomic

Boost.Atomic

#include <boost/atomic.hpp>
#include <thread>
#include <iostream>
boost::atomic<int> a{ 0 };
void thread()
{
	++a;
}
void thread_s()
{
	std::cout << "Hello Thread" << a << '\n';
}
int main()
{
	std::thread t1{ thread };
	std::thread t2{ thread };
	std::thread t3{ thread_s };
	std::thread t4{ thread_s };
	t1.join();
	t2.join();
	t3.join();
	t4.join();
	std::cout << a << '\n';
}

Example45.1

示例 45.1 使用兩個線程來遞增 int 變量 a。該示例使用 boost::atomic 代替鎖來對 a 進(jìn)行原子訪問。該示例將 2 寫入標(biāo)準(zhǔn)輸出。

boost::atomic 之所以有效,是因為一些處理器支持對變量的原子訪問。如果增加一個 int 變量是一個原子操作,則不需要鎖。如果此示例在無法將變量遞增為原子操作的平臺上運(yùn)行,則 boost::atomic 使用鎖。

示例 45.2。 boost::atomic 帶鎖或不帶鎖

#include <boost/atomic.hpp>
#include <iostream>
int main()
{
  std::cout.setf(std::ios::boolalpha);
  boost::atomic<short> s;
  std::cout << s.is_lock_free() << '\n';
  boost::atomic<int> i;
  std::cout << i.is_lock_free() << '\n';
  boost::atomic<long> l;
  std::cout << l.is_lock_free() << '\n';
}

您可以在原子變量上調(diào)用 is_lock_free() 來檢查是否在沒有鎖的情況下訪問該變量。如果您在 Intel x86 處理器上運(yùn)行示例,它會顯示 true 三次。如果您在沒有對 short、int 和 long 變量進(jìn)行無鎖訪問的處理器上運(yùn)行它,則會顯示 false。

Boost.Atomic 提供了 BOOST_ATOMIC_INT_LOCK_FREE 和 BOOST_ATOMIC_LONG_LOCK_FREE 宏來在編譯時檢查哪些數(shù)據(jù)類型支持無鎖訪問。

示例 45.2 僅使用整型數(shù)據(jù)類型。您不應(yīng)將 boost::atomic 與 std::string 或 std::vector 等類一起使用。 Boost.Atomic 支持整數(shù)、指針、布爾值 (bool) 和普通類。整數(shù)類型的示例包括 short、int 和 long。普通類定義可以使用 std::memcpy() 復(fù)制的對象。

示例 45.3。 boost::atomic 和 boost::memory_order_seq_cst

#include <boost/atomic.hpp>
#include <thread>
#include <iostream>
boost::atomic<int> a{0};
void thread()
{
  a.fetch_add(1, boost::memory_order_seq_cst);
}
int main()
{
  std::thread t1{thread};
  std::thread t2{thread};
  t1.join();
  t2.join();
  std::cout << a << '\n';
}

Example45.3E

示例 45.3 增加了兩次——這次不是使用 operator++,而是調(diào)用 fetch_add()。成員函數(shù) fetch_add() 可以采用兩個參數(shù):a 應(yīng)該遞增的數(shù)字和內(nèi)存順序。

內(nèi)存順序指定內(nèi)存訪問操作必須發(fā)生的順序。默認(rèn)情況下,這個順序是不確定的,不依賴于代碼行的順序。只要程序表現(xiàn)得好像內(nèi)存訪問操作是按源代碼順序執(zhí)行的,編譯器和處理器就可以更改順序。此規(guī)則僅適用于線程。如果使用多個線程,內(nèi)存訪問順序的變化會導(dǎo)致程序運(yùn)行錯誤。 Boost.Atomic 支持在訪問變量時指定內(nèi)存順序,以確保內(nèi)存訪問在多線程程序中以所需的順序發(fā)生。

注意

指定內(nèi)存順序可優(yōu)化性能,但會增加復(fù)雜性并使編寫正確代碼變得更加困難。因此,在實踐中,您應(yīng)該有充分的理由使用內(nèi)存順序。

示例 45.3 使用內(nèi)存順序 boost::memory_order_seq_cst 將 a 遞增 1。內(nèi)存順序代表順序一致性。這是最嚴(yán)格的內(nèi)存順序。在 fetch_add() 調(diào)用之前出現(xiàn)的所有內(nèi)存訪問必須在執(zhí)行此成員函數(shù)之前發(fā)生。在 fetch_add() 調(diào)用之后出現(xiàn)的所有內(nèi)存訪問都必須在執(zhí)行此成員函數(shù)之后發(fā)生。編譯器和處理器可以在調(diào)用 fetch_add() 之前和之后重新排序內(nèi)存訪問,但它們不得將內(nèi)存訪問從調(diào)用 fetch_add() 之前移動到調(diào)用之后,反之亦然。 boost::memory_order_seq_cst 是雙向內(nèi)存訪問的嚴(yán)格邊界。

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

相關(guān)文章

  • C++超詳細(xì)講解貪心策略的設(shè)計及解決會場安排問題

    C++超詳細(xì)講解貪心策略的設(shè)計及解決會場安排問題

    為了更好的應(yīng)對《算法設(shè)計與分析》這門課程,我把書上以及老師講過的案例都詳細(xì)的做一個重現(xiàn)及解剖,讓你熟記每一個潛在的考點,希望能給大家?guī)椭?/div> 2022-05-05
  • 基于Qt編寫全能播放組件的示例代碼

    基于Qt編寫全能播放組件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt編寫全能播放組件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • C++ boost::asio編程-域名解析詳細(xì)介紹

    C++ boost::asio編程-域名解析詳細(xì)介紹

    這篇文章主要介紹了C++ boost::asio編程-域名解析詳細(xì)介紹的相關(guān)資料,這里附有實例代碼,幫助大家學(xué)習(xí)理解這部分知識,需要的朋友可以參考下
    2016-11-11
  • C++實現(xiàn)教務(wù)管理系統(tǒng)

    C++實現(xiàn)教務(wù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)教務(wù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • c++中虛函數(shù)的實現(xiàn)詳解

    c++中虛函數(shù)的實現(xiàn)詳解

    眾所周知探索c++對象內(nèi)部的實現(xiàn)是一件非常有趣的事情,虛函數(shù)在c++中的實現(xiàn)機(jī)制就是用虛表和虛指針,但是具體是怎樣的呢?下面這篇文章就來給大家實際檢驗一下 Visual Studio 2013 編譯器在無優(yōu)化條件下,虛函數(shù)的實現(xiàn)。有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C語言中組成不重復(fù)的三位數(shù)問題

    C語言中組成不重復(fù)的三位數(shù)問題

    這篇文章主要介紹了C語言中組成不重復(fù)的三位數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 交換兩個文本內(nèi)容的C語言代碼

    交換兩個文本內(nèi)容的C語言代碼

    這篇文章主要介紹了交換兩個文本內(nèi)容的C語言代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++雙向鏈表的增刪查改操作方法講解

    C++雙向鏈表的增刪查改操作方法講解

    相較單鏈表,雙向鏈表除了data與next域,還多了一個pre域用于表示每個節(jié)點的前一個元素。這樣做給雙向鏈表帶來了很多優(yōu)勢。本文主要介紹了雙向鏈表的實現(xiàn),需要的可以參考一下
    2023-03-03
  • c++實現(xiàn)reactor高并發(fā)服務(wù)器的詳細(xì)教程

    c++實現(xiàn)reactor高并發(fā)服務(wù)器的詳細(xì)教程

    這篇文章主要介紹了c++從零實現(xiàn)reactor高并發(fā)服務(wù)器,包括環(huán)境準(zhǔn)備和基礎(chǔ)知識介紹,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C++淺析程序中內(nèi)存的分布

    C++淺析程序中內(nèi)存的分布

    這篇文章主要介紹了C++內(nèi)存分布及用法,從內(nèi)存的基礎(chǔ)概念到內(nèi)存分配進(jìn)行了講解,內(nèi)存是我們開發(fā)中最重要的一部分,往往邏輯上的錯誤就會造成內(nèi)存泄漏,導(dǎo)致程序無法運(yùn)行,下面我們就來了解文章對該內(nèi)容的詳細(xì)介紹
    2022-08-08

最新評論

科尔| 陈巴尔虎旗| 双柏县| 塘沽区| 开平市| 东明县| 岑溪市| 凤台县| 延吉市| 苍南县| 西青区| 壶关县| 沧州市| 襄汾县| 同仁县| 东莞市| 花莲市| 江川县| 修水县| 广安市| 延庆县| 乐安县| 盘锦市| 新巴尔虎左旗| 嵩明县| 桑日县| 重庆市| 平乐县| 田阳县| 黑河市| 佳木斯市| 台北市| 宁化县| 秭归县| 锡林浩特市| 龙胜| 张家港市| 宿州市| 安义县| 郧西县| 昂仁县|