2016-03-31 35 views
6

好像volatile比較功能在shared_ptr執行不存在。在C++中 - 是否可以將volatile volatile shared_ptr與nullptr進行比較?

它是否有意義存在?

+5

請注意,'volatile'不是一個可移植的線程同步機制(儘管在某些環境中可以說是足夠的)。 le'通常與內存映射I/O和類似的機制一起使用,這對於'shared_ptr'來說是一個奇怪的地方。也許你應該澄清*爲什麼*你會有一個易變的shared_ptr。 – peterchen

+3

@peterchen http://cxx.isvolatileusefulwiththreads.com/ –

+0

@MikeVine:太棒了!必須記住那個鏈接。(每天檢查一下,以防它改變) – peterchen

回答

4

基本上不,該標準不符合comparisonsboolean conversionvolatile 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等)

+0

好的一點,雖然我相信如果我們確實在討論線程,我相信使用std :: atomic在C++ 11中是完全可變的。 – Atifm

3

Volatile只是向編譯器指出內存可能會意外更改。關閉一些優化。在封面下它只是一個內存地址。

共享指針只是持有/管理資源。也就是說,由於std :: shared_ptr :: get()沒有標記爲volatile,所以不能真正使用shared_ptr以可訪問的方式管理易失性指針。

我建議使用裸指針,並使用作用域出口或destructer後清理。

如果您使用volatile,因爲指針可能會被另一個線程修改,您可能需要考慮使用std :: atomic而不是volatile。在線程工作流程中,在std::atomic之前,從其他線程訪問的指針通常標記爲易失性。這不再是最佳做法。

+0

實際上不穩定不是一個建議。它所做的一件事情是:對易失性對象的每次訪問(讀取或寫入操作,成員函數調用等)都被視爲可見的副作用,用於優化目的(即,在單個線程內 – NathanOliver

+1

由於該函數沒有volatile限定符,因此不可能用volatile對象來調用它...... – cpplearner

+0

@nathanOliver按照你的建議改寫它。 – Atifm

相關問題