回答
基本上不,該標準不符合comparisons或boolean conversion在volatile shared_ptr
。
的following fails編譯...
auto main() -> int {
volatile shared_ptr<int> a;
if (a == nullptr) // fails
; // empty
if (a) // fails
; // empty
}
你可以施放volatile
關閉(通過。一個const_cast
),但我不相信會有理想的結果。從cppreference:
修改
const
對象通過非const
訪問路徑,並通過非volatile
glvalue導致不確定的行爲指的是volatile
對象。
更概括地說,在沒有標記成員方法爲volatile
,類或庫實施者要有效地說:「這並非是用作volatile
對象」 - 如果是這樣,那麼適當的方法或過載將提供volatile
對象。同樣,這也適用於const
,在標記部件如const
,他們說:「這個類可以作爲一個const
對象。
爲什麼需要volatile
,哪些外部資源可以被修改shared_ptr
」毫不知情編譯器「(這是volatile
的用途之一)?如果存在線程問題,那麼您最好使用一個線程庫實用程序,或者如果需求僅僅是關閉優化,各種編譯器都有這種機制(pragmas等)
好的一點,雖然我相信如果我們確實在討論線程,我相信使用std :: atomic在C++ 11中是完全可變的。 – Atifm
Volatile只是向編譯器指出內存可能會意外更改。關閉一些優化。在封面下它只是一個內存地址。
共享指針只是持有/管理資源。也就是說,由於std :: shared_ptr :: get()沒有標記爲volatile,所以不能真正使用shared_ptr以可訪問的方式管理易失性指針。
我建議使用裸指針,並使用作用域出口或destructer後清理。
如果您使用volatile,因爲指針可能會被另一個線程修改,您可能需要考慮使用std :: atomic而不是volatile。在線程工作流程中,在std::atomic之前,從其他線程訪問的指針通常標記爲易失性。這不再是最佳做法。
實際上不穩定不是一個建議。它所做的一件事情是:對易失性對象的每次訪問(讀取或寫入操作,成員函數調用等)都被視爲可見的副作用,用於優化目的(即,在單個線程內 – NathanOliver
由於該函數沒有volatile限定符,因此不可能用volatile對象來調用它...... – cpplearner
@nathanOliver按照你的建議改寫它。 – Atifm
- 1. 哪裏可以使用volatile?
- 2. `volatile`是否允許與工會打字?
- 3. 是否可以將一個MySQL TIMESTAMP與毫秒進行比較?
- 4. 是否可以在Cudafy.NET中使用volatile關鍵字?
- 5. 是否可以將char與正則表達式進行比較?
- 6. 是否可以將字符串與變量進行比較?
- 7. 如何在C中註冊「volatile volatile int i」?
- 8. 是否有任何理由在C中聲明「volatile const」,但在C++中只聲明「volatile」?
- 9. volatile boolean
- 10. 在通用C庫中是否有TestAndSet(volatile int * lock)函數?
- 11. C#volatile數組項?
- 12. C中的volatile變量
- 13. C++:將C函數的返回值與NULL或nullptr進行比較?
- 14. C中的整型變量是否可以包含const和volatile限定符?
- 15. 您是否可以與組作爲審閱者進行比較?
- 16. 在C#中使用Volatile關鍵字
- 17. 是否可以將多個分支與git中的一個進行比較?
- 18. 可以在java中將volatile變量定義爲static嗎?
- 19. volatile關鍵字
- 20. Java - 是否需要volatile同步?
- 21. 爲什麼在C++中寄生於'volatile'?
- 22. 是否可以將我的工作副本與任意修訂進行比較?
- 23. iOS UIAutomation:是否可以將屏幕截圖與參考圖像進行比較?
- 24. C++:const volatile的方法
- 25. C++ volatile成員函數
- 26. 在這裏刪除C++ volatile是否安全?
- 27. 本地volatile變量
- 28. 將XML與TXT進行比較C#
- 29. 將crc32與cksum進行比較c
- 30. 什麼是while(!volatile);做?
請注意,'volatile'不是一個可移植的線程同步機制(儘管在某些環境中可以說是足夠的)。 le'通常與內存映射I/O和類似的機制一起使用,這對於'shared_ptr'來說是一個奇怪的地方。也許你應該澄清*爲什麼*你會有一個易變的shared_ptr。 – peterchen
@peterchen http://cxx.isvolatileusefulwiththreads.com/ –
@MikeVine:太棒了!必須記住那個鏈接。(每天檢查一下,以防它改變) – peterchen