簡體   English   中英

std :: atomic :: operator ++真的按值返回嗎?

[英]Does std::atomic::operator++ really return by value?

根據這個前綴, std::atomic<T>::operator++返回一個T ,所以這段代碼只增加v一次:

template<class T> void addTwo(std::atomic<T>& v) {
  ++(++v);
}

此外, std::atomic<T>::operator= 顯然返回一個T ,因此該代碼取消引用一個用於指向臨時T的無效指針:

template<class T>
void setOneThenTwo(std::atomic<T>& v) {
  auto ptr = &(v = 1);
  *ptr = 2;
}

我肯定不會建議這些代碼模式是好的做法,但是std::atomic打破它們對我來說非常令人驚訝。 我總是希望operator=和prefix operator++返回對*this的引用。

問題:這里的返回類型是否正確cppreference,如果是這樣,有沒有一個很好的理由讓std::atomic在這方面的行為與內置類型不同?

如果operator++返回了一個引用,它將是對std::atomic<T>的引用,而不是T在這種情況下,你需要額外load才能得到當前值。

想象一下,你有一個DBMS,你需要保持一個'自動增量'字段

使用operator++重新調整T您可以執行此操作

class AutoIncrement
{
public:
   AutoIncrement() : current (0) {}

   unsigned int next()
   {
      return ++current;
   }

private:
   std::atomic<unsigned int> current;
};

現在假設operator++返回std::atomic<T>&在這種情況下當你return ++current它會做兩件事

  1. 原子讀 - 修改 - 寫
  2. 原子載荷

他們是兩個完全獨立的行動。 如果其他線程調用next之間,你會得到錯誤的價值為您自動增量場!

根據[C++11: 29.6.5/32][C++11: 29.6.5/10] ,是的, cppreference.com在這方面是正確的。

我沒資格告訴你原因。

暫無
暫無

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

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