【问题标题】:Can I copy a single shared_ptr simultaneously?我可以同时复制一个 shared_ptr 吗?
【发布时间】:2017-03-07 16:41:00
【问题描述】:

我知道在 2 个单独的线程中复制和重置单个 shared_ptr 是有问题的,但是尝试创建同一 shared_ptr 对象的副本的 2 个线程呢?需要同步吗?引用计数器在这里可以正常工作吗?

std::shared_ptr<T> global_t(new T());

// Thread 1
std::shared_ptr<T> t1(global_t);
do something with t1

// Thread 2
std::shared_ptr<T> t2(global_t);
do something with t2

【问题讨论】:

    标签: c++ multithreading c++11 shared-ptr atomic


    【解决方案1】:

    std::shared_ptrrefcount is synchronized,所以并发复制是可以的(虽然可能性能较差)。并且托管对象仅在其引用计数降至零时才被释放。

    【讨论】:

    • 这正是std::shared_ptr 违反 C++ 原则的原因“你不用为你不使用的东西付费”。原子递增/递减(用于引用计数)较慢,如果 shared_ptr 从单线程使用则不需要,但std::shared_ptr 没有提供模板参数来使用单线程引用计数器。
    • @AndyT 是的。可以说,这仍然是正确的决定。可能是。不知道第二个变体会有多昂贵......
    • 不。从不同的线程复制和重置相同的shared_ptr 对象而不同步是数据竞争,因此是UB。对控制块的访问是同步的,而不是 shared_ptr 对象本身。这就是为什么在您实际需要原子地操作同一个 shared_ptr 对象时使用所有这些 atomic_* 函数的原因。
    • @T.C.:啊。 MT 很难。
    猜你喜欢
    • 2012-07-18
    • 2022-01-21
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多