我在读关于std::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 (?)
}
};
getter应该是安全的,因为对象将在任何线程的任何点进行初始化或清空。
但是如果我想抛出一个异常,如果对象是空的,我需要在返回它之前检查它,现在是否必须在那里放置一个锁(因为可能在if和返回之间调用stop())。或者可以使用共享指针的锁定机制,而不使用此方法中的锁定:
std::shared_ptr<int> get_obj() const
{
auto tmp = _obj;
if(!tmp) throw std::exception();
return tmp;
}