簡體   English   中英

訪問C ++ 0x的原子<int>為非原子

[英]Accessing atomic<int> of C++0x as non-atomic

我的類型為atomic<int>程序中有一個原子變量。 在某些地方,我不需要原子地訪問它中的值,因為我只是檢查它是否為0。 換句話說,在那些情況下,我想避免在存在原子訪問時發生的總線鎖定等的開銷。

如何非原子地訪問原子變量。 是否使用(int)進行類型轉換,如下所示? 如果沒有,我認為,我該怎么做?

atomic<int> atm;
int x;
........
x = (int)atm; // Would this be a non-atomic access, no bus locking et all?

你無法擺脫原子性屬性。 但是,您可以通過放寬內存排序保證來減少使用原子變量所涉及的一些開銷。

std::atomic<int> a;

int value = a.load(std::memory_order_relaxed);
if(value == 0) {
    // blah!
}

我不建議這樣做,我回應所有的評論,敦促你避免這種情況。 你確定你為原子操作支付了足夠高的成本嗎?做這個黑客並可能引入線程錯誤值得嗎?

在大多數平台上讀取一個int(特別是一個對齊的,一個堆棧變量將是)無論如何都是原子的,所以只需將它分配給一個int將是一個簡單的賦值。

如果變量不能如上所述原子地訪問,那么你仍然需要將其分配以保證它不是半寫的。

即只需使用原子<>變量。 它很好,更安全。

我懷疑這是否有效,因為仍然必須從原子獲得施加到演員表的價值。 我查看了std :: atomic <int>特化聲明,但據我所知,從它們的基類std :: atomic的聲明中,沒有辦法訪問底層變量。

那里有宏聲明應該可以告訴你是否為你的平台使用了鎖,盡管我不確定這些是標准還是擴展方法。 最糟糕的情況是,您可以只評估宏ATOMIC_INT_LOCK_FREE並查看它是否存在。 (注意: atomic<int>處理其他事情,例如確保內存位於適當的邊界等),盡管對你的代碼來說並不重要; 它要么會或者不會,並且似乎沒有一種定義的方式來獲得int。

您也可以通過將其設置為已知值然后使用調試器或通過獲取其地址並將其打印出來來查看原子來查看原子。 你可以像這樣玩一下,並且可能找出一種方法來做某種(非便攜的,非標准的)指針操作來獲取指向值的指針,然后將它存儲在你想做的非你想到的地方 - 原子檢查。

希望你找到你需要的東西!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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