c++ - boost shared_ptr <XXX> 线程安全吗?

标签 c++ boost thread-safety shared-ptr boost-smart-ptr

我有一个关于 boost::shared_ptr<T> 的问题.

有很多线程。

using namespace boost;

class CResource
{
  // xxxxxx
}

class CResourceBase
{
public:
   void SetResource(shared_ptr<CResource> res)
   {
     m_Res = res;
   }

   shared_ptr<CResource> GetResource()
   {
      return m_Res;
   }
private:
   shared_ptr<CResource> m_Res;
}

CResourceBase base;

//----------------------------------------------
// Thread_A:
    while (true)
    {
       //...
       shared_ptr<CResource> nowResource = base.GetResource();
       nowResource.doSomeThing();
       //...
    }

// Thread_B:
    shared_ptr<CResource> nowResource;
    base.SetResource(nowResource);
    //...

第一季度

如果Thread_A不关心nowResource是最新的,这部分代码会有问题吗?

我的意思是当 Thread_BSetResource()完全,Thread_A 得到了一个错误的智能点 GetResource() ?

第二季度

线程安全是什么意思?

如果我不关心资源是否最新,shared_ptr<CResource> nowResource nowResource 时使程序崩溃已发布或该问题是否会破坏 shared_ptr<CResource> ?

最佳答案

boost::shared_ptr<>提供一定程度的线程安全。引用计数以线程安全的方式进行操作(除非您将 boost 配置为禁用线程支持)。

所以您可以复制 shared_ptr周围和 ref_count 保持正确。您不能在多个线程中安全地做的是修改实际的 shared_ptr来自多个线程的对象实例本身(例如从多个线程调用reset())。所以你的使用是不安全的 - 你正在修改实际的 shared_ptr多个线程中的实例 - 你需要有自己的保护。

在我的代码中,shared_ptr 's 通常是局部变量或按值传递的参数,所以没有问题。将它们从一个线程转移到另一个我通常使用线程安全队列。

当然,这些都没有解决访问 shared_ptr 指向的对象的线程安全问题。 - 这也取决于你。

关于c++ - boost shared_ptr <XXX> 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/692438/

相关文章:

C++ 线程安全和 notify_all()

c++ - 成员函数指针的静态成员数组

c++ - 如何附加 read_some 缓冲区?

c++ - Boost.Python 自定义转换器

c++ - boost::filtered_range 值的引用类型

java - 创建一个线程来运行 Postgres 存储函数

c++ - 为什么 `std::lock`不使用全局顺序锁定互斥锁?

c++ - 在编译时替换目标文件中的符号。例如换出 main

c++ - GDB 中的断点

java - 线程安全地从集合中查找和删除对象