是 boost shared_ptr <XXX>线程安全?

2023-07-20C/C++开发问题
7

本文介绍了是 boost shared_ptr <XXX>线程安全?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I have a question about 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是最新的,这部分代码会不会有问题?

Q1

If Thread_A do not care the nowResource is the newest, will this part of code have problem?

我的意思是当Thread_B没有完全SetResource()时,Thread_A通过GetResource()得到一个错误的智能点代码>?

I mean when Thread_B do not SetResource() completely, Thread_A get a wrong smart point by GetResource()?

线程安全是什么意思?

如果不关心资源是不是最新的,shared_ptr会不会是最新的?nowResourcenowResource 被释放时会导致程序崩溃还是会破坏 shared_ptr?

If I do not care about whether the resource is newest, will the shared_ptr<CResource> nowResource crash the program when the nowResource is released or will the problem destroy the shared_ptr<CResource>?

推荐答案

来自 boost 文档:

shared_ptr 对象提供相同的内置线程安全级别类型.shared_ptr 实例可以是读取"(仅使用 const 访问操作)同时由多个线程.不同 shared_ptr实例可以写入"(使用可变操作访问例如 operator= 或 reset)同时由多个线程(即使这些实例是副本,并共享相同的引用计数在下面.)

shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be "read" (accessed using only const operations) simultaneously by multiple threads. Different shared_ptr instances can be "written to" (accessed using mutable operations such as operator= or reset) simultaneously by multiple threads (even when these instances are copies, and share the same reference count underneath.)

任何其他同时访问都会导致未定义的行为.

Any other simultaneous accesses result in undefined behavior.

所以你的使用是不安全的,因为它使用了m_res的同时读写.boost 文档中的示例 3 也说明了这一点.

So your usage is not safe, since it uses simultaneous read and write of m_res. Example 3 in the boost documentation also illustrates this.

您应该使用单独的 mutex 保护对 SetResource/GetResource 中的 m_res 的访问.

You should use a separate mutex that guards the access to m_res in SetResource/GetResource.

这篇关于是 boost shared_ptr &lt;XXX&gt;线程安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&amp;()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6