2017-10-19 128 views
0

是否有可能在shared_ptr的atomic_compare_exchange_strong中與原始指針進行比較?shared_ptr的std :: atomic_compare_exchange_strong與原始指針進行比較

像這樣:

struct Chunk{ 
     // atomics 
     std::shared_ptr<Chunk> prev; 
     std::shared_ptr<Chunk> next; 
    }; 

    // chunk is guaranteed to stay alive while this operation 
    void remove_chunk(Chunk* chunk){ 
     std::shared_ptr<Chunk> prev = std::atomic_load(&chunk->prev); 
     std::shared_ptr<Chunk> next = std::atomic_load(&chunk->next); 

     // Can I do this? 
     std::shared_ptr<Chunk> self{chunk}; 
     std::atomic_compare_exchange_strong(&prev, &self, next); 

     ... 
    }; 

我想過這個,因爲http://en.cppreference.com/w/cpp/memory/shared_ptr/operator_cmp說,僅比原始指針。但是,這是否需要標準,或只是優化的副作用?

這個問題只是關於atomic_compare_exchange_strong的正確性。

回答

1

幾乎可以肯定,這是錯誤的。在remove_chunk(Chunk* chunk),chunk可能只是識別要刪除的塊。在std::shared_ptr<Chunk> self{chunk};中,您意味着您是chunk的所有者,並且self成爲新的所有者。

+0

'chunk'保證在此操作中保持活動狀態。 – tower120

+0

@ tower120:呃,不,因爲'self'強制擁有所有權,將它轉移到'prev',然後超出範圍並刪除塊。你的聲明表明你真的應該寫'remove_chunk(塊和塊)',然後編譯器會發現這個錯誤。 – MSalters

+0

該死的你是對的。那裏有全局鎖定,現在我切換到每個塊鎖定... – tower120