Back to questions
Junior — Middle
87
Обеспечивает ли shared_ptr безопасность при работе в многопоточной среде?
Answer from AI
sobes.tech AI
std::shared_ptr обеспечивает безопасность при работе с самим счетчиком ссылок в многопоточной среде. Это значит, что операции копирования, присваивания и уничтожения shared_ptr объектов потокобезопасны, и счетчик ссылок корректно обновляется при доступе из разных потоков.
Однако, сам объект, на который указывает shared_ptr, не защищён от одновременного доступа из нескольких потоков. Если несколько потоков модифицируют объект, необходимо использовать дополнительные механизмы синхронизации (например, мьютексы).
Пример:
#include <memory>
#include <thread>
#include <iostream>
std::shared_ptr<int> ptr = std::make_shared<int>(42);
void thread_func() {
auto local_ptr = ptr; // безопасно увеличивает счетчик ссылок
std::cout << *local_ptr << std::endl;
}
int main() {
std::thread t1(thread_func);
std::thread t2(thread_func);
t1.join();
t2.join();
}
Здесь операции с shared_ptr потокобезопасны, но если бы мы изменяли *ptr без синхронизации, это было бы небезопасно.