Я читал о безопасности потоков в std :: shared_ptr и о перегрузках атомарных операций, которые он обеспечивает, и интересовался конкретным случаем его использования в классе.
Из моего понимания безопасности потоков, которое обещано от shared_ptr, безопасно иметь метод get, подобный так:
class MyClass
{
std::shared_ptr<int> _obj;
public:
void start()
{
std::lock_guard<std::mutex> lock(_mtx);
_obj = std::make_shared<int>(1);
}
void stop()
{
std::lock_guard<std::mutex> lock(_mtx);
_obj.reset();
}
std::shared_ptr<int> get_obj() const
{
return _obj; //Safe (?)
}
};
Получатель должен быть безопасным, поскольку объект будет либо инициализирован, либо пуст в любой точке из любого потока.
Но что, если я хочу вызвать исключение, если объект пуст, мне нужно проверить его перед возвратом, нужно ли сейчас устанавливать блокировку там (так как stop () может быть вызван между if и return )? Или можно использовать механизм блокировки общего указателя и не использовать блокировку в этом методе:
std::shared_ptr<int> get_obj() const
{
auto tmp = _obj;
if(!tmp) throw std::exception();
return tmp;
}