回到68k的美好時代,由於堆棧指針和其他更通用的地址寄存器之間的相對一般的關係,前/後指針增量/減量或多或少都保證是原子的。由於這種行爲顯然是一種可能無法在替代平臺上獲得最高效率實現的68k人造物,假設C規範沒有聲明這些操作的「原子性」,我是否正確?指針原子的前/後變量?
回答
假設C規範沒有聲明這些操作的「原子性」,我會是正確的嗎?
是的。目前的標準(C99和C89,IIRC)都沒有聲明原子性。這絕對是平臺特定的,也可能取決於編譯器。
爲什麼這些操作有必要是原子的,如果我可以問的話?
感謝您的回答Rafe;只是我正在尋找的信息。當我們用來檢查舊的68k系統上的彙編輸出時,由於寫入和指針增量的原子性質,像「move.l d1,(a3)+」這樣的指令適用於多進程實現。由於我的裝配技能在過去的十年中有所減少,所以我不知道「* a3 ++ = d1」是否帶有任何保證。 – Taliadon
@Taliadon啊,我明白了。那麼,如果你知道你的代碼只能在某些具有某些操作系統和某些編譯器的體系結構上編譯,那麼我猜你可以檢查程序集的輸出結果,但是我懷疑這比它的價值更麻煩。 –
哈哈,我想你是對的;在閱讀了論壇上的一些額外信息之後,我真的不認爲我目前的技能能夠勝任這項工作。我認爲它不會更簡單。再次感謝您提供的信息,非常感謝。 – Taliadon
無論標準如何指定,「巨大」指針上的80x86指針算術和賦值都不是原子的,但指針增量和賦值易於由所有平臺上的原子讀取和原子寫入組成,其中「int」是32位或更大的或其中指針的大小與'int'相同(某些嵌入式平臺具有像16位int但24位指針這樣的東西)。然而,讀取 - 修改 - 寫入序列幾乎不會在任何多處理器體系結構上形成原子單元,除非採取明確的措施使其行爲如此。
除非明確記錄,否則永遠不會保證原子性。根據目前的C標準,這意味着沒有便攜式代碼可以保證原子性 - 原子操作符必然是平臺特定的。
正如@ninjalj在他的評論中指出的那樣,C1x將添加原子操作符。
C標準根本沒有原子操作。但是有一些GCC內置插件described here,並且有一些在C++0X stanard。並且您始終可以在您的代碼中使用POSIX或其他多線程庫或內聯彙編程序。
- 1. 指針前/後增量
- 2. 帶原子變量的指針所有權
- 3. 指針變量
- 4. 指向變量的指針
- 5. MinGW 4.6.2 std ::原子指針
- 6. 指針或全局變量的指針?
- 7. ROM變量指針指向RAM變量?
- 8. int指針變爲void指針,然後變成雙指針
- 9. c#變量指針
- 10. 指針或變量?
- 11. C:指針=變量和指針=變量有什麼區別?
- 12. 更改指針的變量
- 13. 指針變量的地址
- 14. 指針變量的值C
- 15. C指針Matlab的變量
- 16. C++中的指針賦值原子嗎?
- 17. 正在訪問一個類型爲sig_atomic_t的變量,其指針原子爲
- 18. 變量向量的指針向量
- 19. 原子編輯器主題改變字符指針的顏色
- 20. 懸空指針,免費()後價值改變的原因?
- 21. 指向JavaScript中變量的指針
- 22. 在Golang中指定變量的指針
- 23. C++指針浮子矢量
- 24. C指針,指向全局變量:不同的指針
- 25. 本地指針變量
- 26. 用指針交換變量
- 27. 靜態變量指針?
- 28. 指針VS變量,Objective-C
- 29. C++成員變量指針
- 30. 指針寄存器變量
C規範都沒有聲明_any_操作的原子性。 – Nemo
@Nemo:C1x保證新原子操作的原子性。 – ninjalj
我不認爲C本身有任何保證,沒有。 (至少不會如果通過指針遞增,你的意思就像++ ptr),但是,在許多情況下,實際結果確實是原子的。請參閱http://stackoverflow.com/questions/879077/is-changing-a-pointer-considered-an-atomic-action-in-c進行相關討論。 – shelleybutterfly