" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、說(shuō)明

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

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

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

Boost.Atomic 支持與標(biāo)準(zhǔn)庫(kù)大致相同的功能。雖然一些函數(shù)在 Boost.Atomic 中被重載,但它們?cè)跇?biāo)準(zhǔn)庫(kù)中可能有不同的名稱。標(biāo)準(zhǔn)庫(kù)還提供了一些 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 使用兩個(gè)線程來(lái)遞增 int 變量 a。該示例使用 boost::atomic 代替鎖來(lái)對(duì) a 進(jìn)行原子訪問(wèn)。該示例將 2 寫入標(biāo)準(zhǔn)輸出。

boost::atomic 之所以有效,是因?yàn)橐恍┨幚砥髦С謱?duì)變量的原子訪問(wèn)。如果增加一個(gè) int 變量是一個(gè)原子操作,則不需要鎖。如果此示例在無(wú)法將變量遞增為原子操作的平臺(tái)上運(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() 來(lái)檢查是否在沒(méi)有鎖的情況下訪問(wèn)該變量。如果您在 Intel x86 處理器上運(yùn)行示例,它會(huì)顯示 true 三次。如果您在沒(méi)有對(duì) short、int 和 long 變量進(jìn)行無(wú)鎖訪問(wèn)的處理器上運(yùn)行它,則會(huì)顯示 false。

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

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

示例 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() 可以采用兩個(gè)參數(shù):a 應(yīng)該遞增的數(shù)字和內(nèi)存順序。

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

注意

指定內(nèi)存順序可優(yōu)化性能,但會(huì)增加復(fù)雜性并使編寫正確代碼變得更加困難。因此,在實(shí)踐中,您應(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)存訪問(wèn)必須在執(zhí)行此成員函數(shù)之前發(fā)生。在 fetch_add() 調(diào)用之后出現(xiàn)的所有內(nèi)存訪問(wèn)都必須在執(zhí)行此成員函數(shù)之后發(fā)生。編譯器和處理器可以在調(diào)用 fetch_add() 之前和之后重新排序內(nèi)存訪問(wèn),但它們不得將內(nèi)存訪問(wèn)從調(diào)用 fetch_add() 之前移動(dòng)到調(diào)用之后,反之亦然。 boost::memory_order_seq_cst 是雙向內(nèi)存訪問(wèn)的嚴(yán)格邊界。

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

相關(guān)文章

  • return和break的區(qū)別解析

    return和break的區(qū)別解析

    這篇文章主要介紹了return和break的區(qū)別解析,需要的朋友可以參考下
    2014-02-02
  • C語(yǔ)言strcpy庫(kù)函數(shù)詳解

    C語(yǔ)言strcpy庫(kù)函數(shù)詳解

    這篇文章主要為大家介紹了C語(yǔ)言strcpy庫(kù)函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • QT已有項(xiàng)目導(dǎo)入工程時(shí)注意事項(xiàng)圖文詳解

    QT已有項(xiàng)目導(dǎo)入工程時(shí)注意事項(xiàng)圖文詳解

    QT開發(fā)這幾年大大小小項(xiàng)目做了不少,花了點(diǎn)時(shí)間對(duì)知識(shí)點(diǎn)總結(jié)整合了一部分,下面這篇文章主要給大家介紹了關(guān)于QT已有項(xiàng)目導(dǎo)入工程時(shí)注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    很多時(shí)候?yàn)榱朔奖丬浖氖褂?我們需要讓編寫的界面程序顯示在最上層,這時(shí)候就需要對(duì)窗口屬性進(jìn)行調(diào)整,下面這篇文章主要給大家介紹了關(guān)于Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下
    2022-12-12
  • C++輸入輸出操作符重載的深入分析

    C++輸入輸出操作符重載的深入分析

    本篇文章是對(duì)C++輸入輸出操作符重載進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 淺析C++函數(shù)模板和類模板

    淺析C++函數(shù)模板和類模板

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-07-07
  • C++利用隨機(jī)策略實(shí)現(xiàn)優(yōu)化二叉樹操作效率

    C++利用隨機(jī)策略實(shí)現(xiàn)優(yōu)化二叉樹操作效率

    這篇文章中我們主要來(lái)詳細(xì)探討隨機(jī)化二叉搜索樹的基本思想、實(shí)現(xiàn)方法,以及如何在C++中應(yīng)用這些策略來(lái)優(yōu)化我們的數(shù)據(jù)結(jié)構(gòu),感興趣的可以了解下
    2024-02-02
  • C++中vector容器的用法

    C++中vector容器的用法

    在c++中,vector是一個(gè)十分有用的容器。這篇文章主要介紹了C++ vector容器的用法的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • C/C++讀取配置文件的方式小結(jié)

    C/C++讀取配置文件的方式小結(jié)

    這篇文章主要為大家詳細(xì)介紹了C/C++中讀取配置文件的幾種常見(jiàn)方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評(píng)論