Я знаю, что копирование и перепродажа одного shared_ptr
в 2 отдельных потоках проблематично, но как насчет 2 тем, которые пытаются создать копию того же объекта shared_ptr
. Нужна ли синхронизация? Будет ли счетчик ссылок работать правильно здесь?Можно ли одновременно копировать один shared_ptr?
std::shared_ptr<T> global_t(new T());
// Thread 1
std::shared_ptr<T> t1(global_t);
do something with t1
// Thread 2
std::shared_ptr<T> t2(global_t);
do something with t2
и именно поэтому 'std :: shared_ptr' нарушает принцип C++« вы не платите за то, что не используете ». Атомный приращение/декремент (используемый для подсчета ссылок) медленнее и не требуется, если shared_ptr используется из одного потока, но 'std :: shared_ptr' не предоставляет параметр шаблона для использования однопоточного счетчика ссылок. –
@ AndyT Да. По-видимому, это было правильное решение. Может быть. Не знаю, насколько дорогостоящим был второй вариант ... – Deduplicator
Nope. Копирование и сброс одного и того же объекта 'shared_ptr' из разных потоков без синхронизации - это гонка данных и, следовательно, UB. Доступ к блоку управления синхронизируется, а не сам объект shared_ptr. Вот почему есть все эти функции 'atomic_ *', когда вам действительно нужно работать на одном и том же объекте 'shared_ptr' атомарно. –