Я пытаюсь убедиться, что правильно понимаю семантику std::shared_ptr, где:
std::_Sp_counted_base в реализации stdc++, поставляемой с GCC) являются потокобезопасными.std::shared_ptr не является потокобезопасным.Имея это в виду, рассмотрим следующий фрагмент:
struct Data {
std::shared_pointer<X> x;
std::shared_pointer<Y> y;
};
void SomeThread1 (Data d) {
std::shared_pointer<X> localxptr = d.x;
...
}
void SomeThread2 (std::shared_ptr<Data> d) {
std::shared_pointer<X> localxptr = d.x;
...
}
Предполагая, что SomeThread[12] являются их собственными потоками, и тот, кто их создал, передал соответствующие параметры, правильно ли я считаю, что:
SomeThread1 безопасен: поскольку d является скопированным Data, d.x, следовательно, является уникальным экземпляром члена shared_ptr<X> и, таким образом, может быть безопасно скопирован снова в localxptr.SomeThread2 небезопасно: поскольку d является указателем на Data, d.x, следовательно, является тем же экземпляром shared_ptr<X>, что и вызывающий поток, и, следовательно, не может быть безопасно скопирован в localxptr, что рискует как новым потоком, так и вызывающим потоком (и кем-либо еще) доступ к тому же экземпляру shared_ptr<X>.Верна ли моя оценка?
Кажется очевидным, но я просто хочу проверить работоспособность, потому что в последнее время я слишком долго смотрел на много кода.





Другой вопрос, который вы связали, кажется, дает ответ: это зависит от того, что могут делать другие потоки.
shared_ptr не является потокобезопасным, если используется неконстантным способом. Однако вы только передаете его конструктору копирования (9), который принимает его как константную ссылку. Если все другие потоки обращаются к нему таким же образом (ни один из них не пытается изменить его), это безопасно, как написано.
Спасибо; это все, что мне нужно было услышать. Я пошел дальше и подтвердил дублирующую ссылку.