【问题标题】:std::weak_ptr.lock semantic in multi-threaded c++多线程 C++ 中的 std::weak_ptr.lock 语义
【发布时间】: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 的构造之间,另一个线程可以删除最后一个强引用,从而抛出一个 意外异常?如何防止这种情况?

还是我错过了什么?

【问题讨论】:

    标签: c++ weak-ptr


    【解决方案1】:

    你不必阻止它,它由标准库的实现来处理。

    引用的代码仅用于说明目的:lock() 的行为与此代码相同,但相对于其他线程是原子的。

    如果你想知道它是怎么做的,你可以看看源代码。它是一个模板类,所以代码肯定会在头文件中。但要小心!标准 C++ 库源代码不适合胆小的人。

    【讨论】:

    • "lock() 的行为与此代码一样,但相对于其他线程是原子的。"如果是这样,标准文本什么也没说,因此是有缺陷的。
    • @R.MartinhoFernandes:标准没有定义实现,而是定义结果的。所以标准文本就可以了。
    • @R.MartinhoFernandes:转念一想,我想起了 boostweak_ptr::lock() 的原子性,但现在我不确定这是否适用于 libstd 实现。 Thisthis 似乎建议他们这样做,但我现在无法在标准中找到确认......
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多