shared_ptr 的 std::atomic_compare_exchange_strong 与原始指针比较

shared_ptr's std::atomic_compare_exchange_strong comparing with raw pointer

是否可以在 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 正确性。

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