簡體   English   中英

在 C++ 中對普通整數使用原子操作

[英]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來獲取對整數的原子操作。 intstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM