Код, который вы показываете в первом блоке, является частью конструктора копирования или преобразования, например, вы вызываете что-то вроде:
std::shared_ptr<A> some_shared_ptr = some_other_shared_ptr;
Когда поток выполняет строку, либо some_other_shared_ptr
в настоящее время не владеет каким-либо объектом или владеет объектом. Если он владеет объектом, он будет продолжать владеть объектом во время выполнения этого оператора. Поэтому счетчик ссылок на принадлежащий объект равен по крайней мере единице и не может стать нулем, и объект не будет уничтожен во время выполнения оператора.
Если другой поток уничтожает или изменяет (например, путем его сброса), some_other_shared_ptr
потенциально сам объект, в то время как другой поток выполняет оператор, тогда программа имеет гонку данных и неопределенное поведение. Сам объект shared_ptr
не является атомом c (и даже если бы он был, уничтожение его перед доступом к нему в другом потоке вызвало бы неопределенное поведение). Он безопасен только для потоков, в том смысле, что дополнительные собственные копии можно создавать и уничтожать в разных потоках, не вызывая скачки данных, подсчет ссылок на принадлежащий объект становится несовместимым или объект уничтожается несколько раз.