2016-10-25 8 views
3

Я знаю, что копирование и перепродажа одного 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 

ответ

9

так одновременное копирование std::shared_ptr «s refcount is synchronized, это нормально (хотя может быть менее производительным). И управляемый объект освобождается только тогда, когда его refcount падает до нуля.

+1

и именно поэтому 'std :: shared_ptr' нарушает принцип C++« вы не платите за то, что не используете ». Атомный приращение/декремент (используемый для подсчета ссылок) медленнее и не требуется, если shared_ptr используется из одного потока, но 'std :: shared_ptr' не предоставляет параметр шаблона для использования однопоточного счетчика ссылок. –

+2

@ AndyT Да. По-видимому, это было правильное решение. Может быть. Не знаю, насколько дорогостоящим был второй вариант ... – Deduplicator

+2

Nope. Копирование и сброс одного и того же объекта 'shared_ptr' из разных потоков без синхронизации - это гонка данных и, следовательно, UB. Доступ к блоку управления синхронизируется, а не сам объект shared_ptr. Вот почему есть все эти функции 'atomic_ *', когда вам действительно нужно работать на одном и том же объекте 'shared_ptr' атомарно. –

 Смежные вопросы

  • Нет связанных вопросов^_^