shared_ptr< std :: atomic_compare_exchange_strong与原始指针

时间:2017-10-19 12:15:33

标签: c++ shared-ptr atomic compare-and-swap

在shared_ptr' 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 个答案:

答案 0 :(得分:1)

几乎可以肯定,这是错误的。在remove_chunk(Chunk* chunk)中,chunk可能只是识别要删除的块。在std::shared_ptr<Chunk> self{chunk};中,您暗示自己是chunk的所有者,self成为新所有者。