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
成为新所有者。
是否可以在 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
成为新所有者。