определить, является ли std :: shared_ptr уникальной ссылкой на объект - PullRequest
0 голосов
/ 02 февраля 2019

Есть ли способ убедиться, что std::shared_ptr является единственной ссылкой на объект во всей программе?

У меня сложилось впечатление, что следующего было бы достаточно даже в многопоточной среде, но из-за того, что std::shared_ptr::unique устарело, я не уверен (и мое параллельное фу меня подводит):

std::shared_ptr<Foo> bar(std::shared_ptr<Foo>&& src) {
     std::shared_ptr<Foo> self = std::move(src);
     if(self && self.unique()) {
        // self is *the* only reference
     }

     return std::move(self);
}

(редактировать)

Если я правильно понимаю (см. например, Почему std :: shared_ptr :: unique () устарела? ) атомный подсчет ссылок гарантирует, что self - это единственный действующий ref для данных внутри блока if, но модификации через разрушенные ссылки не являются последовательными до вызовом unique() ивозможно, еще не завершено.

Впредь при изменении *self внутри блока if все еще существует потенциальная гонка данных.Это правильно?

1 Ответ

0 голосов
/ 02 февраля 2019

Этого недостаточно, потому что .unique().use_count()) игнорируют любые weak_ptr s, связанные с вашим shared_ptr, которые могут быть одновременно .lock() ed, что делает ваши предположения недействительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...