std::shared_ptr的构造函数和析构函数是安全的吗?



假设我们在thread1中有一个std::shared_ptr<int> sptr;

线程1返回并触发sptr的析构函数;

同时,thread2调用构造函数复制sptr;

具有单个原子的多线程std::shared_ptr如何能够保证该代码在这种竞争条件下不会崩溃?

这个问题有问题。

  • 线程1有一个std::shared_ptr<int> sptr - ok。
  • 线程1返回,sptr超出范围- ok。
  • 这会导致sptr所持有的对象被销毁——好的,但这意味着在任何地方都没有sptr的其他副本,或者它们会保持所包含的对象存活。
  • 线程2拷贝sptr -从哪里?我们刚刚同意共享指针的最后一个副本超出了作用域,这意味着线程2没有地方可以复制它。

所以你的问题的前提有问题。

你可能会想说:"哦,但是我有一个指向sptr的指针,线程2试图通过它复制它",答案是你不应该有指向共享指针的指针(或引用)。它们存在的全部意义在于你按价值传递它们——如果你没有这样做,那么你就违反了合同,它们就不再保证安全。

现在,将指针(最常见的是指向被包含的对象)传递给一些不能使用共享指针(通常是旧的c风格api)的函数是偶尔的正确选择。但是!请注意,当您这样做时,您承担了维护共享指针及其包含对象的生命周期的全部责任,只要该原始指针还在使用中。

最新更新