【发布时间】:2013-06-27 12:05:47
【问题描述】:
std 说:
shared_ptr<T> lock() const noexcept;
返回:
expired() ? shared_ptr<T>() : shared_ptr<T>(*this).
但是在 expired 返回 false (对象仍然存在)和 shared_ptr 的构造之间,另一个线程可以删除最后一个强引用,从而抛出一个 意外异常?如何防止这种情况?
还是我错过了什么?
【问题讨论】:
std 说:
shared_ptr<T> lock() const noexcept;
返回:
expired() ? shared_ptr<T>() : shared_ptr<T>(*this).
但是在 expired 返回 false (对象仍然存在)和 shared_ptr 的构造之间,另一个线程可以删除最后一个强引用,从而抛出一个 意外异常?如何防止这种情况?
还是我错过了什么?
【问题讨论】:
你不必阻止它,它由标准库的实现来处理。
引用的代码仅用于说明目的:lock() 的行为与此代码相同,但相对于其他线程是原子的。
如果你想知道它是怎么做的,你可以看看源代码。它是一个模板类,所以代码肯定会在头文件中。但要小心!标准 C++ 库源代码不适合胆小的人。