【问题标题】:shared_ptr's std::atomic_compare_exchange_strong comparing with raw pointershared_ptr 的 std::atomic_compare_exchange_strong 与原始指针比较
【发布时间】:2017-10-19 12:15:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • chunk 保证在此操作期间保持活动状态。
    • @tower120:嗯,不,因为self 强行取得所有权,将其转移给prev,然后超出范围并删除块。你的陈述表明你真的应该写remove_chunk(Chunk&amp; chunk) 然后编译器就会发现这个错误。
    • 该死的你是对的。以前全局锁的地方,现在我切换到每个块锁...
    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 2013-08-18
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多