Sobes.tech
Back to questions
Junior — Middle
86

Обеспечивает ли 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 без синхронизации, это было бы небезопасно.