我有一个关于 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_B 不 SetResource()
完全,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/