通用的類模板

2021-10-01 09:08:09 字數 1025 閱讀 4107

但是,如果您需要一次讀取或更改幾個變數-std :: atomic a,b,c,-並且不想實現無鎖演算法並解決aba問題,那麼您需要使用鎖。cpu原子cas功能(在大多數cpu中)可以檢查是否僅更改了乙個最大寬度為64位的變數,但是那時可以更改另乙個變數。解決方案:std :: atomic 允許對t型使用任何大小的結構。

在c ++標準中,如果std :: atomic 是「普通可複製型別」,即滿足條件std :: is_trivially_copyable :: value ==,則可以對t使用任何型別的t。真正

c ++標準說明了什麼:http :

§29.5/ 1

引用:有乙個通用的類模板atomic 。模板引數t的型別應是可複製的(3.9)。[注意:不能靜態初始化的型別引數可能很難使用-尾註]

§3.9/ 9

引用:標量型別,普通可複製類型別(第9章),此類型別的陣列以及這些型別的cv限定版本(3.9.3)統稱為普通可複製型別

但是,如果cpu原子cas函式可以檢查是否僅更改了乙個最大寬度為64位的變數,並且我們具有三個32位變數,那麼cas函式將如何在std :: atomic 中工作?cas函式和所**食譜:www.sheonline.cn 有其他函式將自動使用鎖(std :: mutex或其他某個鎖),該鎖包含在std :: atomic 的標準實現中,用於t-普通可複製型別。

要原子地更改幾個變數,我們可以使用變數結構struct t ; 作為std :: atomic 模板的型別。

示例:[5]

輸出示例:10、7、70

在此示例中,在任何時候,最後的值70將等於前兩個值p-10 * 7的乘積-即整個結構僅發生原子變化。

用於x86的gcc和clang中的**將使用-latomic標誌進行編譯。

在這種情況下,每次呼叫std :: atomic shared_val; 將在其中導致鎖定,如功能shared_val.is_lock_free()== false的值所示。

也就是說,在全域性範圍內,當處理原子變數時,我們使用了樂觀鎖(週期),並在本地使用了2個悲觀鎖:獲取舊值並呼叫cas函式。

C 類模板案例 (實現乙個通用的陣列類)

案例描述 實現乙個通用的陣列類,要求如下 hpp檔案 include include using namespace std template class t class myarray 拷貝構造 myarray const myarray arr operator 過載 防止淺拷貝問題 myarr...

c 模板學習12之通用陣列類模板案例封裝

arr.hpp pragma once include using namespace std 通用的陣列模板類 template class t class myarray 深拷貝構造,防止淺拷貝 myarray const myarray a 賦值運算子過載,防止淺拷貝 a b c鏈式程式設計 ...

類模板 模板類

下面定義的是類模板,用int例項化t後成為模板類。例項化類模板的語法 類名 模板實參表 結合下例即 array就是將類模板array例項化為模板類的語法。類模板 include using namespace std templateclass array array t operator int ...