[英]Using atomic operations on a normal integer in C++
我有一個包含表示內部引用計數的整數(比如int m_ref
)的struct
。
為了保持 C 兼容性,我不能將類型更改為std::atomic<int>
: struct
可能只包含普通的舊數據。
但是,我想調整我的代碼以利用 C++11 中的原子特性; 即我需要完成:
++m_ref;
和
--m_ref;
作為原子操作。 我目前正在使用匯編程序(英特爾總線鎖)來執行此操作,但該代碼幾乎不可移植,現在我很想刪除它,因為 C++ 提供了標准構造。
不知何故,我需要進入“幕后”並做atomic<T>
所做的事情,但沒有創建原子類型的開銷:我擔心將 m_ref 附加到atomic<T>
會降低性能。
我懷疑這是很標准的,我在這里遺漏了一些簡單的東西。
您不能在 C++11 中對非原子類型使用原子操作。 您必須使用std::atomic<int>
或std::atomic_int
來獲取對整數的原子操作。 將int
為std::atomic<int>
是未定義的行為。
如果你有一個 C11 編譯器和一個 C++11 編譯器,那么你可以在這兩種情況下使用atomic_int
(對於 C++ 有一個合適的using
聲明)。 如果編譯器兼容,那么一切都會“正常工作”。
從 C++20 開始使用 atomic_ref,你可以這樣做:
#include <atomic>
void add(int& a)
{
std::atomic_ref(a).fetch_add(1);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.