簡體   English   中英

原子指令和原子類型

[英]Atomic instructions and atomic type

默認情況下,是否有可以我自動讀取或修改或比較的類型? 還是應該為所有操作的所有類型顯式使用原子操作?

是的,如果需要原子性,應該始終使用原子類型或原子操作。 沒什么不同。

形式上,默認情況下,沒有非原子類型提供任何種類的原子訪問。 實際上,對於當前的CPU,任何內置類型都可以原子地讀寫(但不能修改)。 但是,這不是您可以保證的,並且絕對不是您應該依靠的。 這僅僅是一個實現細節。
當前CPU上的所有讀取和寫入都通過緩存。 只能從主存儲器讀取或寫回完整的緩存行(通常為64-128字節左右),並且緩存行是最大內置類型的大小的倍數。 這意味着,如果類型正確對齊,則它必然包含在單個高速緩存行中,這將自動使讀取或寫入該原子成為可能。 但是, 修改值是讀-修改-寫操作,這意味着即使每個步驟都是原子操作,整個操作也不是。

原子性不僅僅是能夠原子地讀取(或修改)值,例如,還有一些排序保證,您可能需要正確性。 即使讀寫是原子的,但是如果其他處理器未按您期望的順序看到修改,您的代碼也將無法正常工作。 允許編譯器和CPU重新排序指令,包括加載和存儲(在一定的合理范圍內)。 但是,這可能意味着您的代碼將無法正確執行。

因此,原子操作具有與之關聯的“內存模型”,它使您可以提供關於發生什么事情的附加信息,然后再保證在線程之間以及相關或不相關數據之間需要保證。 有關每種模式的詳細說明,請參見GCC Wiki
默認情況下,原子操作會選擇順序一致的模型,這是具有最嚴格限制的最安全模式。 如果您知道不需要某些保證,則可以選擇其他模型,這可能會(或可能不會,取決於體系結構)導致生成性能更高的代碼。
內存模型的好處在於,它們將實現細節,體系結構特殊性和編譯器巫毒抽象成一種描述您的算法要求並確保滿足這些要求的形式。

通常,編譯器將能夠使用正常的非原子機器指令,並且仍然可以保證滿足您的要求(它可能不得不放棄一個或另一個重新排序)。 這取決於目標硬件如何工作以及需要什么保證的實際細節。
總而言之,與在低級別(內聯匯編程序)上手動進行原子加載相比,原子和內存模型的使用不僅更舒適,而且更不容易出錯,這也可能是性能最高的方法。

查看http://en.cppreference.com/w/cpp/atomic/atomic

它提到了std::atomic<T> ,就像@IgorTandetnik在其中一項注釋中提到的那樣。

暫無
暫無

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

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