2013-11-21 31 views
2

我想知道如果我需要在下列情況下使用std::atomicC++ 11:確保寫入一次讀取的定義語義?

  • 一個(指針)成員變量在對象的構造
  • 在未來的某個時刻初始化,有正好一個寫一些螺紋
  • 幾個其他線程正在讀它(讀取前後寫發生)

,如果我只是在尋找FOLL一致性由於類型:

  • 一個線程看到任一成員變量的初始值或在寫操作之後的值
  • 每個線程最終看到寫操作之後的值(提供它運行足夠長的時間)

如果是,我應該在加載/存儲中使用哪個內存順序(在memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst之外)以獲得儘可能少的開銷?

舉個例子,假設我想實現一個「靜態」單向鏈表只能插在尾部和從不刪除或更改任何下一個指針,即:

Entry { 
    ... 
    const Entry* next; // or std::atomic<const Entry*> next; 
    Entry() : next(NULL) { ... } 
    ... 
}; 
void Insert(Entry* tail, const Entry* e) { 
    tail->next = e; // assuming tail != NULL (i.e. we always have a dummy node) 
} 

回答

1

內存爲了只指示寫入或讀取其他變量,而不是其他線程正在看到的原子。如果您不關心其他寫入或讀取與您的成員變量相關的線索,則甚至可以使用std::memory_order_relaxed

要問其他線程的速度有多快看看你的原子變量寫入,標準說以下內容:(第13年3月29日)

實現應該在合理的時間量內作出原子負荷看見原子店。

0

要決定需要什麼內存順序,您需要提供有關將使用該成員變量的更多信息。如果您正在使用原子指針字段來引用新創建的對象,並且該對象包含您希望讀者訪問的字段,那麼您需要確保建立同步。這意味着商店需要成爲一個發佈版本,並且可能需要獲取負載。雖然取決於細節消費可能工作。在這一點上,明智地使用消費性能沒有任何優勢,所以我可能會堅持獲得。

嘗試使用CDSChecker實例來了解您需要做什麼。